gpt4 book ai didi

c++ - 关闭 Qt 中的所有小部件,除了一些

转载 作者:行者123 更新时间:2023-11-28 00:26:09 24 4
gpt4 key购买 nike

我刚刚开始研究相当复杂的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com