不断更新 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 元素