1. 程式人生 > >QT在子視窗外單擊關閉子視窗

QT在子視窗外單擊關閉子視窗

網上查到了好多種方法,1.新增過濾器(eventFilter),2.重寫滑鼠單擊事件,這兩種方法都要判斷滑鼠單擊位置是不是在子視窗上。而且在可編輯控制元件上如(下拉框、文字編輯框等),父視窗會直接傳遞到可編輯控制元件上,過濾器和重寫的滑鼠事件無法獲取單擊事件。

bool eventFilter(QObject *watched, QEvent *event);//過濾器
 void mousePressEvent(QMouseEvent *ev);//滑鼠事件

其實最簡單有效的方法是設定視窗標誌位

setWindowFlags(Qt::FramelessWindowHint | Qt::Popup);
Qt::Popup表明此視窗為最上層模態視窗,點選子視窗之外的位置都會自動隱藏,類似於選單的效果。需要注意的是,使用move(point)函式來移動子視窗時,需要用全域性座標,雖然它的父物件沒有變,但是座標變成了全域性座標,需使用move(mapToGlobal(point))。