使用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与后台动作隔离开来,那么即使你在后台进行繁重的工作也会做出正确的反应,你应该考虑使用QRunnableQTread来卸载远离UI线程的工作。

以上是关于使用QT 4.7 - 对话框正忙着加载一件大事;如何禁用所有控件?的主要内容,如果未能解决你的问题,请参考以下文章

QT5.5 QSound isFinshed

C#逐行写入文件

在 Swift 中重新加载/更新视图

Jquery mobile 和 google maps openinfowidow 加载而不是点击

Qt 小部件 4.7 与 5.1 [关闭]

CMake的一些使用