2017-06-29 234 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();