应用程序在后台运行时如何弹出QMessageBox?

Posted

技术标签:

【中文标题】应用程序在后台运行时如何弹出QMessageBox?【英文标题】:How to pop up QMessageBox when the application is running in background? 【发布时间】:2014-09-26 15:13:14 【问题描述】:

我一直在开发一个处理视频处理的 Qt C++ 应用程序。通常需要很长时间,以便用户启动进程并最小化等待窗口。

现在我遇到了在进程完成时无法提醒用户的问题。我可以在前台的应用程序中显示一个 QMessageBox。但是,当用户最小化应用程序并处理其他内容时,没有消息可以主动通知用户。

此通知不一定是弹出窗口。它甚至可能在任务栏中闪烁。任何建议,将不胜感激。

提前致谢!

编辑:

感谢大家快速详细的回复。 QMessageBox 和 QSystemTrayIcon 是两种可能的解决方案。我确实通过以下代码部分解决了我的问题:

HWND hHandle = FindWindow(NULL,L"nameOfYourApplication");
FLASHWINFO pf;
pf.cbSize = sizeof(FLASHWINFO);
pf.hwnd = hHandle;
pf.dwFlags = FLASHW_TIMER|FLASHW_TRAY; // (or FLASHW_ALL to flash and if it is not minimized)
pf.uCount = 8;
pf.dwTimeout = 75;
FlashWindowEx(&pf);

这将使任务栏闪烁。再次感谢参与其中的每一个人!

【问题讨论】:

【参考方案1】:

您可以使用QSystemTrayIcon 显示任务栏托盘中的消息x。

使用方法QSystemTrayIcon::showMessage 触发通知。

使用QSystemTrayIcon::setVisible(bool visible),您可以显示/隐藏托盘中的图标。

使用QSystemTrayIcon::setIcon 设置所需的图标。

【讨论】:

+1 为您服务,这可能是一个解决方案,但我发布的答案解决了隐藏应用程序时隐藏消息框的问题。 我使用相同的想法,但是它是用 windows api 而不是 qt api 实现的。不过谢谢!我没有足够的声誉来支持你的回答。我希望我有。【参考方案2】:

QMainWindow 内部:

ShowWindow((HWND)this->winId(), SW_MINIMIZE);//#include <windows.h>
ShowWindow((HWND)this->winId(), SW_MAXIMIZE);
showMessageBox();

【讨论】:

【参考方案3】:

QSystemTrayIcon 是正常的解决方案,但是您应该添加新代码,托盘中的许多应用程序可能会很烦人,因此您应该确定您的应用程序确实需要图标托盘。回到原来的问题:

如果你使用这个:

QMessageBox::information(this,"title","text");

那么您的QMessageBox 将真正隐藏为您的窗口,但是当您使用它时:

qApp->setQuitOnLastWindowClosed(false);
QMessageBox box;
box.setText("text");
box.exec();

或者这个例子:

qApp->setQuitOnLastWindowClosed(false);
QMessageBox *box = new QMessageBox(this);
box->setWindowTitle("title");
box->setText("text");
box->show();

如果你的窗口是否隐藏,你会得到这个QMessageBox

为什么我们需要qApp-&gt;setQuitOnLastWindowClosed(false);?默认情况下,Qt 应用程序在最后一个窗口关闭时关闭,因此如果您关闭此框但窗口将被隐藏,则应用程序将被关闭。使用setQuitOnLastWindowClosed 会正常运行。

编辑:

QMessageBox *box = new QMessageBox;
box->setWindowTitle("title");
box->setText("text");
box->show();
this->showNormal();

【讨论】:

好吧,我不确定 100% 应用程序最小化时 QMessageBox 的模态调用是否会显示给用户并“主动通知”用户。我认为需要在应用程序的 MainWindow 上另外调用 QWindow::raise() 之类的东西。 @N1ghtLight 我测试了它,这是正常的,但我改进了我的答案,有一些有用的东西。有兴趣的可以看看。 对不起,我在 Win 8.1 上试过了,但它不起作用。出现消息框,但最小化的应用程序不会上升,也不会主动通知用户。同样看起来,因为您建议使用 setQuitOnLastWindowClose,您认为主应用程序窗口将被隐藏,但作者写道应用程序只是最小化到任务栏。 @N1ghtLight 对不起,我没听懂你的意思。当然,如果窗口被最小化并且你想显示它,你应该打电话给this-&gt;showNormal();看我的编辑。现在正常吗? 调用 this->showNormal() 也无济于事。你在什么操作系统上测试?在 Windows 8.1 上,如果我最后运行您的代码示例,您的最后一个代码 sn-p 在应用程序启动 5 秒后由 QTimer 触发,则: 1. 打开应用程序窗口。 2.我将应用程序最小化到任务栏,其他应用程序窗口现在处于活动状态。 3. 5秒后,我的测试应用开始在任务栏中闪烁,但没有打开等,我没有看到消息,我需要在任务栏中单击它才能看到消息。你有其他行为吗?

以上是关于应用程序在后台运行时如何弹出QMessageBox?的主要内容,如果未能解决你的问题,请参考以下文章

如何打开弹出窗口来警告用户并在后台运行?

当应用程序在后台运行时,iOS 7.x 上的 UINavigationController 推送/弹出错误

当应用程序关闭或在后台运行时弹出 UIAlertView 窗口

Qt 去掉QMessageBox上的标题栏

QMessageBox:warning里怎么显示中文

在后台运行时显示弹出窗口的权限