根据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'),当然还有终止零.没有其他控制字符 - 如果从源接收它们,我用'*'替换它们
我将四行文本作为单个零终止的cstring发送到QLabel setText()
我有时这样做在相当高的速度,几次第二至少 - 这是从FM电台RDBS数据,以便在实时的变化:
qDebug() << rbl; // data keeps coming to console ui->fourLineLabel->setText(rbl); // add this, display soon stops updating
这有效.一阵子.然后显示停止更新.这是有争议的领域:
4行QLabel http://fyngyrz.com/images/RDSarea.png
如果我把其他所有内容都删除了setText()
,那么就不会出现问题.
我知道,对于某些事情,Qt希望在绘画事件中完成绘画.这也是真的setText()
吗?
阅读关于qt小部件的文档,它说小部件在他们自己的绘画事件中做自己的绘画......但是这里的行为非常类似于当一个人真正试图在油漆之外使用画家时所发生的那种事件.它肯定与那个有关setText()
,所以......嘟..
写此,应用程序已运行了好几个小时,没有任何显示锁止,通过qDebug输出相同的文本到控制台().如果我取消注释setText(),则问题大约需要5分钟.它是100%可重复的.
有什么我应该做的,我不是在做,油漆方面或类似的?
谢谢你的帮助.
一般情况下,你不应该从非UI线程更新Qt控件,只允许少量的事情来处理非UI线程中的绘画 - http://doc.qt.io/qt-4.8/threads-modules.html
如果您需要从非UI线程更新UI - 使用信号和插槽(QueuedConnection
或BlockingQueuedConnection
连接,但请确保不要创建死锁BlockingQueuedConnection
).或者,如果您不想创建额外的信号和插槽以进行一些简单的更新 - 请使用invokeMethod(它甚至可以返回值,如果您将其与BlockingQueuedConnection
连接类型一起使用,则您的线程将一直等到UI更新).
一般建议 - 如果你有可能 - 打一个电话来进行大量的UI更新,而不是几个小电话.