簡體   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