[英]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 -project
, qmake
, make
。 使用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起)。
您有兩個問題:
您可以在更改標簽后使用QApplication::processEvents()
來解決此問題
對於該問題,您可以考慮同時運行該函數(例如,使用線程),也可以分步進行一些較小的步驟,讓主線程在其逐步執行步驟的同時完成其主要工作(事件處理)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.