QWidget paintEvent无理由地被调用

时间:2014-11-25 19:58:39

标签: c++ multithreading qt

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

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

  1. 阅读线程获取并识别数据包
  2. 读取线程将数据放入缓冲区(QAbstractTableModel派生类)
  3. 在同一个函数中,读取线程将带有Qt :: DirectConnection的信号发送到UI基本窗口小部件,该窗口小部件将绘图窗口小部件作为其子窗口。接收器插槽称为slotPQDataChanged
  4. slotPQDataChanged调用子窗口小部件的update函数:poSubWidget->update();
  5. 在主线程中,在Qt" wish"时,调用poSubWidget的paintEvent(QEvent*)函数。它内部有一个QPainter,用于绘制接收到的数据。
  6. 此过程每秒发生5次。当我启动系统时,一切都运行良好一段时间(通常为5-10分钟),但随后突然更新poSubWidget停止发生。我肯定知道它不是停止的阅读线程,因为通过调用qDebug(),我知道" slotPQDataChanged"继续被称为。我也知道它不是被杀死的主线程或类似的东西,因为当问题发生时屏幕上的计时器继续正常工作。我知道我的代码中没有任何意义,我要求在调用update()时子窗口小部件不会更新。

    当然,我不知道发生了什么;对SO的快速研究没有给出积极的结果。

    值得一提的是,我的应用程序可能有一个错误,因为内存不足而导致它被杀死#34;

    那么,有关可能发生的事情的任何建议吗?

2 个答案:

答案 0 :(得分:2)

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

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

连接

答案 1 :(得分:1)

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

相关问题