应用程序在后台运行时如何弹出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->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->showNormal();
看我的编辑。现在正常吗?
调用 this->showNormal() 也无济于事。你在什么操作系统上测试?在 Windows 8.1 上,如果我最后运行您的代码示例,您的最后一个代码 sn-p 在应用程序启动 5 秒后由 QTimer 触发,则: 1. 打开应用程序窗口。 2.我将应用程序最小化到任务栏,其他应用程序窗口现在处于活动状态。 3. 5秒后,我的测试应用开始在任务栏中闪烁,但没有打开等,我没有看到消息,我需要在任务栏中单击它才能看到消息。你有其他行为吗?以上是关于应用程序在后台运行时如何弹出QMessageBox?的主要内容,如果未能解决你的问题,请参考以下文章
当应用程序在后台运行时,iOS 7.x 上的 UINavigationController 推送/弹出错误