gpt4 book ai didi

c++ - QWidget paintEvent 无故停止调用

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:41:52 29 4
gpt4 key购买 nike

在我的一个 Qt 应用程序中更新 QWidget 时,我发现了一个非常奇怪的情况。当 widget->update() 方法在没有任何警告或命令的情况下被调用时,widget 的 paintEvent(QEvent*) 突然停止调用。

我的应用程序在带有 Qt 4.8.5 for ARM 的嵌入式 Linux 中工作,有两个(相关的)线程:一个从套接字连接获取数据,用它填充缓冲区并调用远程对象中的槽要求它更新绘图小部件(带有 update() 函数)。另一个线程是负责执行 void paintEvent(QEvent*) 函数的小部件绘制(Qt 中的规则)的主线程。所以事件的顺序是:

  1. 读取线程获取并识别数据包
  2. 读取线程将数据放入缓冲区(QAbstractTableModel 派生类)
  3. 在同一函数中,读取线程使用 Qt::DirectConnection 向 UI 基础小部件发出信号,该小部件将绘图小部件作为其子部件。接收器槽称为 slotPQDataChanged
  4. slotPQDataChanged 调用子 widget 的 update 函数:poSubWidget->update();
  5. 在主线程中,在Qt“希望”的时刻,调用了poSubWidget 的paintEvent(QEvent*) 函数。它内部有一个 QPainter,可以在其上绘制接收到的数据。

这个过程大约每秒发生 5 次。当我启动系统时,一切正常运行了一段时间(通常为 5-10 分钟),但突然 poSubWidget 的更新停止了。我确定不是读取线程停止了,因为感谢对 qDebug() 的调用,我知道继续调用“slotPQDataChanged”。我也知道它不是被杀死的主线程或类似的东西,因为当问题发生时屏幕上的计时器继续正常工作。而且我知道在调用 update() 时,我的代码中没有要求子部件不更新的地方。

当然,我不知道发生了什么;对 SO 的(快速)研究没有返回任何积极结果。

值得一提的是,我的应用程序可能有一个错误,有时会因为“内存不足”而导致它被终止。

那么,对于可能发生的事情有什么建议吗?

最佳答案

1) 首先解决“内存不足”问题。它很容易成为问题的根源。

2) 使用 Qt::DirectConnection 将线程连接到 GUI除非您确切地知道自己在做什么,否则这不是一个好主意。 (它也可能是问题的根源)线程和 gui 应该使用 Qt::QueuedConnection 连接。

关于c++ - QWidget paintEvent 无故停止调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27135590/

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