打开应用程序主窗口 在系统托盘图标中的其他应用程序之上

Open Application main window On top of other applications from systray icon

本文关键字:应用程序 其他 窗口 系统托盘图标      更新时间:2023-10-16

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

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

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)

找到一个可行的解决方案 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.上述方法在窗口行为方面存在小问题。最后,它是这样完成的:

QWindow* mainWindow = qApp->topLevelWindows()[0];
mainWindow->show();
mainWindow->raise();
mainWindow->requestActivate();
相关文章: