使用QT 4.7 - 对话框正忙着加载一件大事;如何禁用所有控件?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用QT 4.7 - 对话框正忙着加载一件大事;如何禁用所有控件?相关的知识,希望对你有一定的参考价值。
[编辑] - 没有像我想象的那样进入禁用代码;适用于以下任何解决方案。
我有一个无模式的QT对话框,可以操作各种用户设置。此外,它可以保存和加载大型数据集,这可能需要几秒钟。在下面的主窗口(实时应用程序)中进行了很多,这很好,并且可以进行交互,但在对话框本身中,我需要阻止用户交互。
本质上,在加载过程中,我不希望用户能够更改/影响无模式对话框中的任何控件(并且有很多控件)。
而不是单独禁用每一个(如果这是唯一的方法,甚至是那种方式),是否有一种简单的方法可以用来完全禁用对话框的输入,直到加载完成?
其中有一个进度条,显示正在进行的操作,它会不断地由加载过程更新,因此需要继续工作。
我试过这个......
打开对话框:
QDialog *window = this;
然后围绕加载:
window->setDisabled(true);
....
window->setDisabled(false);
...编译好,并且无怨无悔地运行,但窗口没有禁用。
我也尝试过:
window->setEnabled(false);
....
window->setEnabled(true);
......似乎也没有做任何事情。
我也试过这个:
QList<QWidget*> list = window->findChildren<QWidget *>();
foreach(QWidget *qw, list)
{
qw->setEnabled(false);
}
....
QList<QWidget*> list = window->findChildren<QWidget *>();
foreach(QWidget *qw, list)
{
qw->setEnabled(true);
}
..也没什么。
基于Qt文档(http://doc.qt.io/archives/qt-4.8/qwidget.html#enabled-prop):
禁用窗口小部件会隐式禁用其所有子窗口。除非已明确禁用所有子窗口小部件,否则分别启用它们。
所以你的片段基本上以不同的方式做同样的事情,所以这似乎不是问题,对话的形式也不会对此产生任何影响。你是如何加载/保存数据的?如果您在例如单击插槽然后您基本上阻止UI事件循环,这意味着UI没有周期来响应您的更改。如果你想将UI与后台动作隔离开来,那么即使你在后台进行繁重的工作也会做出正确的反应,你应该考虑使用QRunnable
或QTread
来卸载远离UI线程的工作。
以上是关于使用QT 4.7 - 对话框正忙着加载一件大事;如何禁用所有控件?的主要内容,如果未能解决你的问题,请参考以下文章