QWidget paintEvent 无故停止调用

Posted

技术标签:

【中文标题】QWidget paintEvent 无故停止调用【英文标题】:QWidget paintEvent stop being called without reason 【发布时间】:2014-11-25 19:58:38 【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

在我的视频播放程序中遇到了同样的问题 - paintEvent() 在大约 5 分钟后停止被调用。通过将update() 调用从单独的线程移动到小部件的插槽之一(通过信号调用)来解决此问题。所以请确保您从 QT 的事件线程中调用 update

【讨论】:

以上是关于QWidget paintEvent 无故停止调用的主要内容,如果未能解决你的问题,请参考以下文章

QWidget.paintevent() 与 QLabel.setPixmap()

qt下的时钟程序(简单美丽,继承自QWidget的Clock,用timer调用update刷新,然后使用paintEvent作画就行了,超详细中文注释)good

paintEvent(QPaintEvent*)是系统自动调用的

QWidget 的 QT paintEvent

PyQt - 我可以在paintEvent中添加一个QWidget吗?

Qt paintEvent事件 显示图片文字