在delphi中使用Application.BringToFront;可以保證當前程序顯示在最前。
然而今天在Qt中,沒有類似函數供調用。
嘗試了activeWindow,show,showNormal,showMaximized 等函數還是不行。
網上有方法設置窗體的windowFlags,具體方法為:
pMainForm->setWindowFlags(pMainForm->windowFlags() | Qt::WindowStaysOnTopHint); pMainForm->showNormal();
但是該代碼會導致該窗體霸道的總是在最前,無法切換到諸如瀏覽器等其他應用。即使再設置如下代碼:
pMainForm->setWindowFlags(pMainForm->windowFlags() & ~Qt::WindowStaysOnTopHint); pMainForm->showNormal();
也不能取消“總在最前”這個狀態。
其實我就是想要其顯示在最前面而已,最后想到用windows消息,模擬windows切換任務欄,但無奈不清楚windows是如何發送該消息的。
經過網上搜查,如下代碼即可解決,將窗口顯示到最前的效果,且無其他副作用:
if (pMainForm->isMinimized()) { pMainForm->showNormal(); } //設置窗口置頂 ::SetWindowPos(HWND(pMainForm->winId()), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); ::SetWindowPos(HWND(pMainForm->winId()), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); pMainForm->show(); pMainForm->activateWindow();
如果只設置 HWND_TOPMOST ,就會又出現總是在最前的情況。
參考:http://forum.qt.io/topic/6032/bring-window-to-front-raise-show-activatewindow-don-t-work-on-windows