【问题标题】:Open Application main window On top of other applications from systray icon打开应用程序主窗口 在系统托盘图标的其他应用程序之上
【发布时间】:2017-12-03 02:12:45
【问题描述】:

Qt 应用程序最小化。 UI 在 QML 上实现,ApplicationWindow 作为主窗口。

当我右键单击托盘中的应用程序图标时,会显示一个菜单。菜单项之一是“打开”。单击它时,会调用此代码(很可能是多余的):

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

如果双击托盘图标时调用相同的代码,应用程序窗口将打开,但仍保留在其他应用程序下。

如何解决这个问题?

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: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)

窗口停留在其他应用程序下时的输出:

[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)

【问题讨论】:

  • 你能在这两种情况下用你的调试器检查 newWindowState 的值吗?
  • 我知道您已经找到了解决方案,但是如果您检查它并感兴趣为什么以前的方法不起作用,我可能会有一个有趣的答案;)
  • 我在两种情况下都得到了相同的结果(添加到描述中)。你隐藏的东西很有趣)

标签: c++ windows qt


【解决方案1】:

找到了可行的解决方案 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
}

edit 1. 上述方法对窗口的行为有一些小问题。最后是这样完成的:

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

【讨论】:

    猜你喜欢
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    相关资源
    最近更新 更多