2017-06-29 262 views
0

之上的其他應用程序之上最小化Qt應用程序。 用ApplicationWindow作爲mainwindow在QML上實現的UI。打開應用程序主窗口在系統托盤圖標

當我右鍵單擊托盤中的應用程序圖標時,會顯示一個菜單。其中一個菜單項是「打開」。當點擊它,這個代碼被稱爲(最有可能的,冗餘):

mainWidget->activateWindow(); 
window->showNormal(); 
Qt::WindowState newWindowState = (Qt::WindowState)((window->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); 
window->setWindowState(newWindowState); 

如果托盤圖標時,雙擊相同的代碼被調用時,應用程序窗口會打開,但仍然低於其他應用程序。

如何解決這個問題?當窗口仍在其他應用

[16:00:17] [D] GetCurrentThreadId: 1092 
[16:00:17] [D] windowFlags: QFlags<Qt::WindowType>(Popup|WindowTitleHint|WindowSystemMenuHint|WindowMinMaxButtonsHint|WindowCloseButtonHint|WindowFullscreenButtonHint) 
[16:00:17] [D] windowState: Qt::WindowState(WindowMinimized) 
[16:00:17] [W] QWindow::setWindowState does not accept Qt::WindowActive 
[16:00:17] [D] GetCurrentThreadId: 1092 
[16:00:17] [D] windowFlags: QFlags<Qt::WindowType>(Popup|WindowTitleHint|WindowSystemMenuHint|WindowMinMaxButtonsHint|WindowCloseButtonHint|WindowFullscreenButtonHint) 
[16:00:17] [D] windowState: Qt::WindowState(WindowNoState) 

輸出::

qDebug() << "GetCurrentThreadId: " << GetCurrentThreadId(); 
qDebug() << "windowFlags: " << mainWidget->windowFlags(); 
qDebug() << "windowState: " << window->windowState(); 

mainWidget->activateWindow(); 
window->showNormal(); 
Qt::WindowState newWindowState = (Qt::WindowState)((mainWindow()->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); 
window->setWindowState(newWindowState); 

qDebug() << "GetCurrentThreadId: " << GetCurrentThreadId(); 
qDebug() << "windowFlags: " << mainWidget->windowFlags(); 
qDebug() << "windowState: " << window->windowState(); 

輸出當應用程序成功打開

[16:00:23] [D] GetCurrentThreadId: 1092 
[16:00:23] [D] windowFlags: QFlags<Qt::WindowType>(Popup|WindowTitleHint|WindowSystemMenuHint|WindowMinMaxButtonsHint|WindowCloseButtonHint|WindowFullscreenButtonHint) 
[16:00:23] [D] windowState: Qt::WindowState(WindowMinimized) 
[16:00:23] [W] QWindow::setWindowState does not accept Qt::WindowActive 
[16:00:23] [D] GetCurrentThreadId: 1092 
[16:00:23] [D] windowFlags: QFlags<Qt::WindowType>(Popup|WindowTitleHint|WindowSystemMenuHint|WindowMinMaxButtonsHint|WindowCloseButtonHint|WindowFullscreenButtonHint) 
[16:00:23] [D] windowState: Qt::WindowState(WindowNoState) 
+0

你可以用你的調試器在這兩種情況下檢查newWindowState的值嗎? – KjMag

+0

我知道你已經找到了解決方案,但是如果你檢查它並且感興趣爲什麼之前的方法不起作用,我可能會有一個有趣的答案;) – KjMag

+0

在兩種情況下我都得到了相同的結果(添加到描述中)。你隱藏的內容非常有趣) –

回答

0

實測值的工作溶液 https://stackoverflow.com/a/41565553/3569069

for (QWindow* appWindow : qApplication.allWindows()) 
{ 
    appWindow->show(); //bring window to top on OSX 
    appWindow->raise(); //bring window from minimized state on OSX 

    appWindow->requestActivate(); //bring window to front/unminimize on windows 
} 

編輯1.上述方法在windows的行爲方面存在小問題。最後,它是這樣做的:

QWindow* mainWindow = qApp->topLevelWindows()[0]; 
mainWindow->show(); 
mainWindow->raise(); 
mainWindow->requestActivate(); 
相關問題