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

标签 c++ windows qt

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

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

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
}

edit 1. 上述方法在 Windows 行为方面存在一些小问题。最后是这样的:

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

关于c++ - 打开应用程序主窗口 在系统托盘图标的其他应用程序之上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44824070/

相关文章:

c++ - 顶点在 Frustum 外的 OpenGL 透视投影裁剪多边形 = 错误的纹理映射?

c++ - 舍入误差检测

Java 将 csv 从服务器导出到可能不在同一操作系统上的客户端

c++ - 在许多 malloc/free 小块内存之后 malloc 大块内存失败

c++ - 如何在Qt中比较两个RGB图像?

python - 定制和理解 GnuRadio QT GUI Vector Sink

macos - 使用 Qt 构建时无法使用 C++11 功能

c++ - 将一个模块的所有代码放在一个接口(interface)后面。好主意与否?

c++ - C/C++ 中的并发日志文件访问

windows - Windows 上的 TensorFlow : "Couldn' t open CUDA library cudnn64_5. dll"