qt中置頂窗口一般都知道用這個函數:
this->setWindowFlags(Qt::FramelessWindowHint);
但是這樣會有一個問題:
當我在程序啟動顯示窗口的時候,不停的點擊其他窗口,使當前運行的程序窗口獲取不到焦點,那么程序窗口即使設置了FramelessWindowHint flag,
主窗口也并沒有置頂。代碼如下:
main.cpp
#include "mainwindow.h"#include <Qapplication>int main(int argc, char *argv[]){ QApplication a(argc, argv); MainWindow w; w.show(); return a.exec();}#include "mainwindow.h"#include <QApplication>#include <QDesktopWidget>#include <QThread>MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ this->setFixedSize(QSize(QApplication::desktop()->width(), QApplication::desktop()->height())); // 一般情況下會自定義關閉按鈕 this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint); this->setAutoFillBackground(true); // 假設有其他資源需要初始化,如果構造時間較短,不容易看到效果。 QThread::sleep(1);}MainWindow::~MainWindow(){}程序開始運行后不停點擊其他窗口(如QtCreator),就會發現窗口程序出現在任務欄,但是窗口并沒有置頂。
具體原因還有待進一步研究。
嘗試多種解決辦法:
1.點擊一個按鈕后show出一個子置頂窗口。 (無效)
2.點擊一個按鈕后show出一個新的窗口(subwindow屬性,父窗口為空,用智能指針管理內存)。(有效,但是新show出來的窗口不能響應事件,被最開始的窗口覆蓋掉了);
...
后來想到直接用windows的置頂窗口的函數,但是還是會出現剛開始的那個問題。
然后嘗試其他各種怪招。。。
最后無意之間將show();這句代碼寫到置頂窗口的構造函數就行了!
最終代碼如下:
main.cpp
#include "mainwindow.h"#include <QApplication>#include <windows.h>int main(int argc, char *argv[]){ QApplication a(argc, argv); MainWindow w; //[!] 新增代碼, 需要在.PRo文件加上 LIBS += -lUser32 ::SetWindowPos((HWND)w.winId(), HWND_TOPMOST, 0, 0, w.width(), w.height(), SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); return a.exec();}mainwindow.cpp#include "mainwindow.h"#include <QApplication>#include <QDesktopWidget>#include <QThread>MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ this->setFixedSize(QSize(QApplication::desktop()->width(), QApplication::desktop()->height())); // 一般情況下會自定義關閉按鈕 this->setWindowFlags(Qt::FramelessWindowHint/*|Qt::WindowStaysOnTopHint*/);// [!]需要注釋qt的置頂屬性 this->setAutoFillBackground(true); // 假設有其他資源需要初始化,如果構造時間較短,不容易看到效果。 QThread::sleep(1); //[!]新增代碼 show();}
新聞熱點
疑難解答