我的QLabel
未从插槽更新。我使用QObject::moveToThread
:
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
将文本更改为&#34;服务成功发送响应。&#34;。在控制台中,我可以看到qDebug() << "Requesting";
正常工作,因此状态已成功更改。
评论后ui->label->setText("Service send response succesfully.");
标签已更改为请求状态,但 之后整个操作已完成,即我看到&#34;请求&#34;在控制台然后&#34;闲置&#34;之后QLabel发生了变化。
如果我想看到QLabel实时更改,我该怎么办?
答案 0 :(得分:3)
首先,尝试在update()
之后添加setText()
,setText()
可能无法为repaint()
自动安排QLabel
,如果有效的话然后问题解决了。
但是,对于update()
功能:
http://doc.qt.io/qt-4.8/qwidget.html#update
void QWidget :: update()
此功能不会立即重绘;相反 当Qt返回主要时,计划绘制事件以进行处理 事件循环。这允许Qt优化以获得更高的速度和更低的速度 闪烁而不是调用 repaint()。
<强>&GT;多次调用update()通常只会导致一次 paintEvent()调用。
基本上说,如果你过于频繁地称呼它们,其中一些会被优化掉。
如果这不是所需的行为,请尝试在repaint()
之后添加强制setText()
,或使用计时器安排定期强制重绘。
http://doc.qt.io/qt-4.8/qwidget.html#repaint
<强>更新强>
正如评论中所提到的,强制repaint()
并不是一个好的解决方案。
这个答案旨在分析代码行为的原因以及强迫repaint()
&#34;建议更多地是验证此分析的方法,而不是解决问题的方法。
但是,如果没有关于该计划目的的进一步信息,提供进一步的建议是非常困难的。
答案 1 :(得分:1)
从请求到空闲的状态变化很快发生。文本&#34;请求来自服务的响应......&#34;标签上的标签不够长,眼睛看不到它。
&#34;请求......&#34;在调试输出中是证明这一点,但如果你想要更多证据,你还可以做其他事情:
使用每次调用statusChanged()函数时计数的计数器,并将其显示在与状态文本相同的标签中(除状态文本外)或其他标签。
< / LI>向调试输出添加高精度定时器输出 - 查看状态变化的接近程度。
使用几个复选框,一个用于空闲状态,另一个用于请求状态。收到适当的状态时更改其状态。即收到第一个空闲时,设置复选框进行检查。收到下一个空闲时,将其切换为未选中状态。
我只是接受调试输出说实话并继续前进。