簡體   English   中英

QLabel沒有從廣告位調用更新

[英]QLabel not updating from slot call

我的QLabel不是從插槽更新的。 我使用QObject::moveToThread在單獨的線程中運行sender類:

QThread* serviceThread = new QThread;
service = new ExportService();
connect(service,SIGNAL(stateChanged(Service::ServiceState)),
        this,SLOT(statusChanged(Service::ServiceState)));
service->moveToThread(serviceThread);
serviceThread->start();

服務對象通過發出帶有ServiceState枚舉值的信號來發送狀態,該信號被QDialog插槽捕獲:

void Dialog::statusChanged(Service::ServiceState s)
{
    switch (s) {
    case Service::IDLE:
        qDebug() << "Idle";
        ui->label->setText("Service send response succesfully.");
        break;
    case Service::REQUESTING:
        qDebug() << "Requesting";
        ui->label->setText("Requesting response from service...");
        break;
    case Service::ERROR:
        qDebug() << "Error";
        ui->label->setText("Error. Cannot get response from service.");
        break;
    default:
        break;
    }
}

在對發出信號兩次的對象進行操作之后,第一次使用Service::REQUESTING值,第二次使用Service::IDLE值,我的QLabel僅將文本更改為“服務成功發送響應”。 在控制台中,我可以看到qDebug() << "Requesting"; 可以使狀態成功更改。

注釋掉ui->label->setText("Service send response succesfully."); 標簽已更改為請求狀態,但是完成整個操作 ,即在控制台中看到“請求”,然后是“空閑”,並且該QLabel已更改。

如果我想實時查看QLabel怎么辦?

首先,嘗試在setText() update()之后添加update() ,很可能setText()不會自動為QLabel安排repaint() ,如果它可以工作,那么問題就解決了。


但是,對於update()函數:

http://doc.qt.io/qt-4.8/qwidget.html#update

無效的QWidget :: update()

此功能不會導致立即重繪; 相反,當Qt返回到主事件循環時,它將安排一個繪畫事件進行處理。 與對repaint()的調用相比,這允許Qt優化以提高速度和減少閃爍。

>多次調用update()通常只會導致一次paintEvent()調用。

基本上就是說,如果您經常調用它們,其中的一些將被優化。

如果這不是所需的行為,請嘗試在setText()之后添加強制repaint() setText() ,或使用計時器安排定期的強制重繪。

http://doc.qt.io/qt-4.8/qwidget.html#repaint


更新

正如評論中提到的那樣,強制repaint()並不是一個好的解決方案。

該答案旨在提供代碼行為原因的分析,而“ forced repaint() ”建議更多地是一種驗證此分析的方法,而不是解決問題的方法。

但是,如果沒有有關程序目的的進一步信息,很難提供進一步的建議。

從請求狀態到空閑狀態的變化很快發生。 標簽上的文本“正在請求服務響應...”沒有足夠長的時間讓眼睛看到它。

調試輸出中包含“正在請求...”這一事實就是證明,但是如果您想獲得更多證明,則可以執行其他操作:

  1. 使用一個計數器,該計數器在每次調用statusChanged()函數時進行計數,並以與狀態文本相同的標簽(除狀態文本之外)或不同的標簽顯示。

  2. 在調試輸出中添加高精度計時器輸出-查看狀態變化的緊密程度。

  3. 使用幾個復選框,一個用於空閑狀態,另一個用於請求狀態。 收到適當的狀態后,請更改其狀態。 在收到第一個空閑時,將復選框設置為選中。 收到下一個空閑時,將其切換為未選中狀態。

我只接受調試輸出說明事實並繼續前進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM