1.添加過濾器(eventFilter),
bool eventFilter(QObject *watched, QEvent *event);//過濾器
2.重寫鼠標單擊事件,這兩種方法都要判斷鼠標單擊位置是不是在子窗口上。而且在可編輯控件上如(下拉框、文本編輯框等),父窗口會直接傳遞到可編輯控件上,過濾器和重寫的鼠標事件無法獲取單擊事件。
void mousePressEvent(QMouseEvent *ev);//鼠標事件
3.其實最簡單有效的方法是設置窗口標志位
setWindowFlags(Qt::FramelessWindowHint | Qt::Popup);
Qt::Popup表明此窗口為最上層模態窗口,點擊子窗口之外的位置都會自動隱藏,類似於菜單的效果。
需要注意的是,使用move(point)函數來移動子窗口時,需要用全局坐標,雖然它的父對象沒有變,但是坐標變成了全局坐標,需使用move(mapToGlobal(point))。