繁体   English   中英

C ++ Qt保留操作顺序:在继续之前更新QLabel

[英]C++ Qt preserve order of operation: update QLabel before moving on

在代码的一部分中(如下所示),在下一行的generate函数完成工作之后 ,标签会用文本更新。 在开始生成之前,我需要更新标签。

void myDialog::my_custom_slot()
{
   emit someLabel->setVisible(true);
   emit someLabel->setText("Some Text...");

   string result = func.generate_str(); // operation takes 5 to 10 second
}

我仍在学习Qt的基础知识。 我的程序直接退出,没有任何其他线程活动。 到目前为止,我的猜测一直是Qt的线程正在做一些有趣的事情,但是我不确定如何获得期望的结果。

使用Qt 4.8,Ubuntu 16.04编译过程: qmake -projectqmakemake 使用Qt designer生成的.ui文件,someLabel来自生成的ui _... h文件,而myDialog与生成的.h文件和QDialog具有is-a关系。 func.generate_str()来自本地#include“ ...”和实例func。 该程序的所有其他部分都可以成功运行。

UI操作通常不会同步完成。 尝试在事件循环的下一次迭代中甚至稍后进行调度func.generate_str() 这样的事情可能会起作用:

QTimer::singleShot(0, [&]{ func.generate_str(); });

0为0毫秒,仅表示下一次运行循环迭代。 第二个参数的有趣语法是C ++ lambda(自C ++ 11起)。

您有两个问题:

  1. 您的标签未更新,因为主线程在进入generate_str()函数之前无法返回事件循环。

您可以在更改标签后使用QApplication::processEvents()来解决此问题

  1. 在GUI程序的主线程上运行的函数调用需要5到10秒钟,这意味着该应用程序将在此期间被“冻结”。

对于该问题,您可以考虑同时运行该函数(例如,使用线程),也可以分步进行一些较小的步骤,让主线程在其逐步执行步骤的同时完成其主要工作(事件处理)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM