[英]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()
”建議更多地是一種驗證此分析的方法,而不是解決問題的方法。
但是,如果沒有有關程序目的的進一步信息,很難提供進一步的建議。
從請求狀態到空閑狀態的變化很快發生。 標簽上的文本“正在請求服務響應...”沒有足夠長的時間讓眼睛看到它。
調試輸出中包含“正在請求...”這一事實就是證明,但是如果您想獲得更多證明,則可以執行其他操作:
使用一個計數器,該計數器在每次調用statusChanged()函數時進行計數,並以與狀態文本相同的標簽(除狀態文本之外)或不同的標簽顯示。
在調試輸出中添加高精度計時器輸出-查看狀態變化的緊密程度。
使用幾個復選框,一個用於空閑狀態,另一個用於請求狀態。 收到適當的狀態后,請更改其狀態。 在收到第一個空閑時,將復選框設置為選中。 收到下一個空閑時,將其切換為未選中狀態。
我只接受調試輸出說明事實並繼續前進。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.