我有一个自定义QDialog,其中包含一个包含4个独立QOpenGLWidget
实例的层次结构。
这些QOpenGLWidget
中的每一个都有自己的GL上下文,并呈现不同的场景。
我有一个循环,在每个update()
上定期调用QOpenGLWidget
(重新绘制它们的推荐方法)(定期聚焦一个,但我认为这与问题无关)。
我的问题是,最终经过随机的时间(有时会很快发生,有时10分钟内不会发生),一个或多个QOpenGLWidget
将在{{1}时停止重新绘制被称为。
但我注意到,调整停滞的update()
会导致触发单个重绘事件。
我可以看到调试器在所有QOpenGLWidget
上调用了update()
,但这绝不会触发停顿的小部件的QOpenGLWidget
(重绘方法)。并且paintGL()
始终返回true,无论是否updatesEnabled()
触发重绘。 QT也没有向控制台打印任何错误或警告。
包含这些小部件的对话框在与触发update()
的单独线程中运行,因此我无法直接调用update()
(无需编写自己的事件循环)。
将repaint()
添加到触发QApplication::sync()
的方法中也没有任何区别。
我倾向于认为当ram可用较少时它会发生更多,但是更少的ram是800mb的量级,并且应用程序使用的数量明显少于此。所以我的直觉可能是错的。
我不是QT的大用户,所以我不太清楚从哪里开始进一步调试问题,欢迎任何建议。鉴于错误的可重复性涉及等待一段未知的时间和一个更复杂的多线程项目,无法想象我试图用一小段代码重现错误会有很多好处。
在update()
上调用update()
时遇到了完全相同的问题,但每次只发生几次更新后就会发生这种情况。
发现this建议改为使用QGraphicsScene
更新视口,似乎已解决问题。
viewport()->update()
但是没有视口以相同的方式更新。