我刚刚开始研究非常复杂的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)并向主事件循环重新发送信号?
最佳答案
因此,我想出了一个首先关闭模式对话框的解决方案:
foreach(QWidget *w, qApp->topLevelWidgets()) {
if ( w != loginDialog &&
w != mainWindow &&
w->isWindow() &&
w->isModal() ) {
w->close();
}
}
重要的是这里不包括
!w->objectName().isEmpty()
,否则不会捕获匿名MessageBox。由于QWidget::close()
在内部使用deleteLater()
,因此可以这样关闭窗口小部件并在事件循环中正确处理删除似乎是可以的。我不能使用
QApplication::activeModalWidget
,因为我的loginDialog也是模态的(但是隐藏的),并且通过activeModalWidget进行的循环最终陷入无限循环。关于c++ - 关闭Qt中的所有小部件,除了一些小部件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24933461/