【发布时间】:2019-10-02 15:21:28
【问题描述】:
Qt 4.7.1、Qt Creator 2.1.0、OS X 10.6.8 下:
我在主窗口 ui 中有一个 QLabel,它使用 Courier New / 13,有四行文本的空间。
我创建了四行文本,比水平标签短得多,一般格式:
“我的文字\r\n”
我在发送之前过滤文本。 cstring 中唯一的字符将是 0x0D、0x0A、0x20(空格)以及从那里到小写 z(0x7A'),当然还有终止零。没有其他控制字符 - 如果它们是从源接收的,我将它们替换为 '*'
我通过setText()将四行文本作为一个以零结尾的 cstring 发送到 QLabel
我有时会以相当高的速度执行此操作,至少每秒几次 - 这是来自 FM 电台的 RDBS 数据,因此它会实时变化:
qDebug() << rbl; // data keeps coming to console
ui->fourLineLabel->setText(rbl); // add this, display soon stops updating
这行得通。一阵子。然后显示停止更新。这是有争议的领域:
(来源:fyngyrz.com)
如果我把其他所有东西都留在里面,但取出setText(),则不会出现问题。
我知道对于某些事情,Qt 希望在绘画事件中完成绘画。 setText() 也是这样吗?
阅读关于 qt 小部件的文档,它说小部件在自己的绘制事件中进行自己的绘制......但是这里的行为与实际尝试在外面使用画家时发生的那种故障非常相似的油漆事件。而且肯定和那个setText()有关,所以……喃喃自语。
在我写这篇文章时,应用程序已经运行了几个小时,没有任何显示锁定,通过 qDebug() 将相同的文本输出到控制台。如果我取消注释 setText(),大约需要 5 分钟才能出现问题。它是 100% 可重复的。
有什么我应该做而我没有做的事情,绘画方面的还是类似的?
感谢您的帮助。
【问题讨论】:
-
是的,ui 线程没有正确绘制您的数据。使用事件监听器,你应该没问题。它发生在我身上好几次了。
-
Sreekar,我不知道您所说的“使用事件侦听器”是什么意思——我是否应该为窗口提供一个绘画事件,即使我没有绘画?是这样吗?
-
“我知道对于某些事情,Qt 希望在绘画事件中完成绘画”。不只是为某些事情,为所有人。但是没有正常的方法(除了像grabToImage这样的例外)做任何绘画,而是在必要时通过QWidget::update()在事件循环中触发重绘。 QLabel::setText() 也是如此。
-
"如果我将其他所有内容都留在里面,但取出 setText(),则不会出现问题。" - 这是什么意思?如果您取出 setText(),则根本没有更新。我假设您验证了 setText() 行在您期望更新发生时一直被调用?
-
@fyngyrz 你是否从非 ui 线程调用
ui->fourLineLabel->setText(rbl);?