原文:https://blog.csdn.net/hl1hl/article/details/85244451
前言
在Qt開發桌面軟件的過程中,根據開發的需求不同,我們經常需要將彈出窗口,一般常見的是需要是以下兩種。
鎖定彈出的窗口,阻塞其他窗口(包括主窗口)的操作,只有關閉當前窗口才能點擊其他窗口或者主窗口
保持當前窗口一直顯示在最頂層,但是不鎖定(即同時可以操作其他窗口),同時也需要保證不影響其他程序
知識准備
首先我們需要了解一下 QMainWindow、QWidget、QDialog 的區別。
具體可以看以下鏈接,我只說下結論。
-
如果需要嵌入至其他窗體中,則基於 QWidget 創建;
-
如果是頂級對話框,則基於 QDialog 創建;
- QDialog 又分為非模態對話框、模態對話框、半模態對話框
-
如果是主窗體,則基於 QMainWindow 創建
相信你看了上面的許多開發者就會知道自己的一個最基本的錯誤的:通過繼承 QWidget 來創建彈出窗口,這個最基本的錯誤會導致你無法實現以上兩點將窗口置頂以及其他不合理的Bug。
記住重要的一點,創建頂級(彈出)對話框,基於 QDialog 來創建。如果是彈出窗口基於 QWidget 來創建也沒有關系,不需要重要修改太多,只需 setWindowflags(Qt::Dialog)。
具體操作
一、針對第一種鎖定彈出窗口
1、如果窗口是基於QDialog創建。
topWindow.setParent(this);//指定父窗口,一般是目前將你彈出的窗口
topWindow.exec();//模態
2、如果窗口是基於QWidget創建(不建議這么做)
topWindow->setWindowFlags(topWindow->windowFlags() |Qt::Dialog);
topWindow->setWindowModality(Qt::ApplicationModal); //阻塞除當前窗體之外的所有的窗體
topWindow->show();
二、設置窗口一直保持在頂層,但是不阻塞用戶操作其他窗口
1、如果窗口是基於QDialog創建的
topWindow=new TopWindow(this);//指定父窗口
topWindow.show();//非模態
2、如果窗口是基於QWidget創建的(不建議)
topWindow.setParent(this);//指定父窗口
topWindow.setWindowFlags(topWindow.windowflags()| Qt::Dialog);
topWindow.show();
以上 topWindow 是窗體類新建的對象。
其他的窗口置頂方式
其實有其他將窗口置頂的方式,但是是對於所有程序的窗口都置頂。也就是說其他程序打開后也在被置頂的窗口所遮蓋。
我所知道的有兩種方式:
topWindow->setWindowFlags(topWindow->windowFlags() | Qt::WindowStaysOnTopHint);
或者
SetWindowPos(HWND(topWindow->winid()),HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);