【发布时间】:2014-07-24 12:17:09
【问题描述】:
我刚刚开始研究相当复杂的 Qt 应用程序。一件事一直困扰着我。我们有一个“自动注销”功能,当大多数小部件在一段时间不活动后关闭并显示登录提示时。用这个槽就完成了:
foreach(QWidget *w, qApp->topLevelWidgets()) {
if ( w != loginDialog &&
w != mainWindow &&
!w->objectName().isEmpty() &&
(w->isWindow() ) ) {
w->close();
}
}
基本上它会遍历除 LoginDialog 和 MainWindow 之外的所有小部件。这似乎工作正常,直到我们发现它不能正确处理模态对话框。特别是像QMessageBox::warning 这样的对话框。现在的想法是先遍历模态小部件,然后再遍历普通小部件。您认为这是正确的方法吗?
UPD:抱歉,我必须撤回对答案的接受。
我的问题似乎在这里描述为https://blogs.kde.org/2009/03/26/how-crash-almost-every-qtkde-application-and-how-fix-it-0。看起来“关闭”请求是在 MessageBox 的本地事件循环中处理的。我应该改写我的问题:是否可以退出本地事件循环(即关闭 MessageBox)并将信号重新发送到主事件循环?
【问题讨论】: