QLabel不从插槽调用更新

时间:2015-05-05 01:45:57

标签: c++ multithreading qt

我的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将文本更改为&#34;服务成功发送响应。&#34;。在控制台中,我可以看到qDebug() << "Requesting";正常工作,因此状态已成功更改。

评论后ui->label->setText("Service send response succesfully.");标签已更改为请求状态,但 之后整个操作已完成,即我看到&#34;请求&#34;在控制台然后&#34;闲置&#34;之后QLabel发生了变化。

如果我想看到QLabel实时更改,我该怎么办?

2 个答案:

答案 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;在调试输出中是证明这一点,但如果你想要更多证据,你还可以做其他事情:

  1. 使用每次调用statusChanged()函数时计数的计数器,并将其显示在与状态文本相同的标签中(除状态文本外)或其他标签。

    < / LI>
  2. 向调试输出添加高精度定时器输出 - 查看状态变化的接近程度。

  3. 使用几个复选框,一个用于空闲状态,另一个用于请求状态。收到适当的状态时更改其状态。即收到第一个空闲时,设置复选框进行检查。收到下一个空闲时,将其切换为未选中状态。

  4. 我只是接受调试输出说实话并继续前进。