gpt4 book ai didi

c++ - qt - 绘画事件之外的 setText 不好吗?

转载 作者:可可西里 更新时间:2023-11-01 18:29:14 24 4
gpt4 key购买 nike

在 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

这行得通。一阵子。然后显示停止更新。这是有问题的区域:

4-line QLabel
(来源:fyngyrz.com)

如果我保留所有其他内容,但取出 setText(),则不会出现问题。

我知道对于某些事情,Qt 希望在绘制事件中完成绘制。 setText() 也是如此吗?

阅读有关 qt 小部件的文档,它说小部件在自己的绘画事件中进行自己的绘画……但是这里的行为与实际尝试在外部使用画家时发生的那种错误非常相似油漆事件。而且它肯定与那个 setText() 有关,所以......咕哝。

在我写这篇文章时,应用程序已经运行了几个小时,没有任何显示锁定,通过 qDebug() 向控制台输出相同的文本。如果我取消对 setText() 的注释,大约需要 5 分钟才会出现问题。它是 100% 可重复的。

是否有我应该做但没有做的事情,绘画方面的或类似的?

感谢您的帮助。

最佳答案

一般来说,您不应该从非 UI 线程更新 Qt 控件,只允许在非 UI 线程中对绘画进行少量操作 - http://doc.qt.io/qt-4.8/threads-modules.html

如果您需要从非 UI 线程更新 UI - 使用信号和插槽(QueuedConnectionBlockingQueuedConnection 连接,但请确保不要使用 BlockingQueuedConnection 创建死锁)。或者,如果您不想为一些简单的更新创建额外的信号和插槽 - 使用 invokeMethod (它甚至可以返回值,如果您将它与 BlockingQueuedConnection 连接类型一起使用,您的线程将等待 UI 更新)。

还有一条一般性建议 - 如果可能的话 - 一次调用即可对 UI 进行大量更新,而不是几次小调用。

关于c++ - qt - 绘画事件之外的 setText 不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34486240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com