【发布时间】: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。这将导致高事件流量,但应该也能正常工作