不断更新 GUI 表单元素,使表单不会挂起

Posted

技术标签:

【中文标题】不断更新 GUI 表单元素,使表单不会挂起【英文标题】:Updating GUI form elements continuously so that Form does not hang 【发布时间】:2013-08-15 20:00:51 【问题描述】:

正如标题所述,我正在尝试通过线程连续更新 GUI 表单元素,但表单似乎仍然很忙。我无法理解。这就是我的处理方式。

connect(this,SIGNAL(SIGUpdateForm),this,SLOT(MyUpdateMehtod));

现在每当需要更新表单时,我只需执行以下操作。我在新线程中启动一个方法。然后新线程触发上述信号。

boost::thread t(&SomeClass::SomeMethod(),this);

现在,一旦 someMethod 在这里启动,我就是这样做的

void SomeMethod()

      SIGUpdateForm(); //Launch the signal that will update the form

SIGUpdateForm 然后调用 MyUpdateMehtod() 但是因为信号(无论是排队还是直接不启动任何线程,因此看起来表单被挂起。)但这让我感到困惑,因为信号本身是从独立线程调用的,所以为什么表格挂了吗?我能做些什么来完成这项工作?

【问题讨论】:

Qt 不支持从多个线程更新 GUI 元素。任何读取或写入 GUI 元素的事情都需要在主线程(即运行 QApplication::exec() 的线程)中发生 【参考方案1】:

Qt 有自己的线程。实际上你不需要线程。 QTimer 会为你做这件事。这是一个例子。

void updateForm()

 ui->bla->setText("bla");
 // bla bla method


QTimer timer;
connect(&timer, SIGNAL(timeout()), this, SLOT(updateForm()));
timer.start(3000);

现在updateForm() 将每 3 秒调用一次。 GUI 不会挂起。另一种方法是处理事件循环,

while(....)

 // some lengthy task
 qApp->processEvents(QEventLoop::AllEvents);

【讨论】:

感谢您的回复。第二种方法需要在独立线程中触发吗?

以上是关于不断更新 GUI 表单元素,使表单不会挂起的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 4 表单 CollectionType:仅使新行需要 FileType 元素

表单中Readonly和Disabled的区别

如何使用角度指令动态地使表单元素只读?

form表单元素中disabled的元素的值不会提交到服务器

jQuery控制form表单元素聚焦

第三章 XHTML 表单