在我的一个Qt应用程序中更新QWidget时,我发现了一个非常奇怪的情况。发生的事情是,在没有任何警告或命令的情况下调用widget-> update()方法时,窗口小部件的paintEvent(QEvent *)突然停止被调用。
我的应用程序,在嵌入式Linux中使用Qt 4.8.5 for ARM,有两个(相关的)线程:一个从套接字连接获取数据,用它填充缓冲区并调用远程对象中的一个插槽,要求它更新绘图小部件(带有update()函数)。另一个线程是负责小部件绘制(Qt中的规则)的主线程,它执行void paintEvent(QEvent*)
函数。所以事件的顺序是:
slotPQDataChanged
。 slotPQDataChanged
调用子窗口小部件的update
函数:poSubWidget->update();
paintEvent(QEvent*)
函数。它内部有一个QPainter,用于绘制接收到的数据。 此过程每秒发生5次。当我启动系统时,一切都运行良好一段时间(通常为5-10分钟),但随后突然更新poSubWidget停止发生。我肯定知道它不是停止的阅读线程,因为通过调用qDebug()
,我知道" slotPQDataChanged"继续被称为。我也知道它不是被杀死的主线程或类似的东西,因为当问题发生时屏幕上的计时器继续正常工作。我知道我的代码中没有任何意义,我要求在调用update()
时子窗口小部件不会更新。
当然,我不知道发生了什么;对SO的快速研究没有给出积极的结果。
值得一提的是,我的应用程序可能有一个错误,因为内存不足而导致它被杀死#34;
那么,有关可能发生的事情的任何建议吗?
答案 0 :(得分:2)
1)首先解决“内存不足”问题。它很容易成为问题的根源。
2)除非您确切知道自己在做什么,否则使用Qt::DirectConnection将线程连接到GUI并不是一个好主意。 (它也可能是问题的根源)Thread和gui应该使用Qt::QueuedConnection
连接答案 1 :(得分:1)
我的视频播放程序中存在相同的问题-paintEvent()
在大约5分钟后停止调用。通过将update()
调用从单独的线程移到小部件的插槽之一(通过信号调用)来解决。因此,请确保您在QT的事件线程中调用update
。