【问题标题】:Why is not Qt label refreshed?为什么 Qt 标签没有刷新?
【发布时间】:2015-08-16 17:26:51
【问题描述】:

这是我通过单击按钮调用的方法

void ChangeLabelText(QLabel* myLabel)
{
    int countNumber = 0;
    for(int i = 0; i < 9999; i++)//outer loop
    {
        for(int k = 0; k < 65000; k++)//inner loop
        {
            countNumber++;
        }
        myLabel->setText(QString::number(countNumber));
    }
}

当代码运行时,标签的文本设置在outer loop 的末尾,但我希望它在每次inner loop 完成时设置标签的文本。可能是什么原因造成的?

【问题讨论】:

  • 您的代码在主线程和主线程中执行,UI 更新发生在事件回调上。你需要的是强制重绘你的用户界面。您可以通过调用repaint() 或要求应用程序处理事件QCoreApplication::processEvents() 来实现。你需要在更改标签后制作它。
  • 每次循环都会设置文本——但标签不会重新绘制,直到执行返回事件循环并且可以处理绘制事件。如果控件在其属性更改时实时重新绘制,您会看到大量闪烁。
  • @johngull 你的回答很完美。您可以输入它作为答案,以便像我这样的业余爱好者可以看到答案。
  • 您可以尝试QMetaObject::invokeMethod(myLabel, "setText", Q_ARG(QString, QString::number(countNumber)), Qt::QueuedConnection); QMetaObject::invokeMethod(myLabel, "repaint", Qt::QueuedConnection);,而不是直接调用 setText。这将导致高事件流量,但应该也能正常工作

标签: c++ qt qt4


【解决方案1】:

您在主线程中执行的代码和在主线程中的 UI 更新发生在事件回调上。你需要的是强制重绘你的用户界面。您可以通过调用repaint() 或通过使用QCoreApplication::processEvents() 要求应用程序处理事件来做到这一点。更换标签后需要制作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 2019-06-24
    • 2016-10-22
    相关资源
    最近更新 更多