【问题标题】:QWidget paintEvent stop being called without reasonQWidget paintEvent 无故停止调用
【发布时间】: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 中的规则)的主线程。所以事件的顺序是:

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

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

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

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

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

【问题讨论】:

    标签: c++ multithreading qt


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-06
        • 1970-01-01
        • 2016-09-23
        • 2021-11-25
        相关资源
        最近更新 更多