2

我有一个自定义 QDialog,其中包含一个层次结构,其中包含 4 个单独的QOpenGLWidget.

这些中QOpenGLWidget的每一个都有自己的 GL 上下文,并呈现不同的场景。

我有一个循环,它定期调用update()(重新绘制它们的推荐方法)QOpenGLWidget(更经常地关注一个,但我认为这与问题无关)。

我的问题是,最终在随机时间后(有时它发生得很快,有时它不会发生 10 多分钟),一个或多个's 将在被调用QOpenGLWidget时停止重新绘制。update()

然而,我注意到调整停滞的大小QOpenGLWidget会导致触发单个重绘事件。

我可以看到update()在所有 's 上调用的调试器QOpenGLWidget,但这永远不会触发paintGL()停滞的小部件(重绘方法)。并且updatesEnabled()始终返回 true,无论是否update()触发重绘。QT 也不会向控制台打印任何错误或警告。

包含这些小部件的对话框在与触发的线程不同的线程中运行update(),因此我无法repaint()直接调用(无需编写自己的事件循环)。

添加QApplication::sync()到触发的方法update()也没有什么不同。

我倾向于认为当可用内存较少时它会发生更多,但是更少的内存大约为 800mb,并且应用程序使用的内存要少得多。所以我的直觉可能是错误的。

我不是 QT 的大用户,所以我不太确定从哪里进一步调试问题,欢迎提出任何建议。鉴于错误的重现性涉及等待未知的时间长度和更复杂和多线程的项目,无法想象尝试用一小段代码重现错误会对我有多大好处。


更新:

update()在调用a时遇到了完全相同的问题QGraphicsScene,但是每次仅在几次更新后才发生。

发现这个建议改为更新视口,viewport()->update()它似乎已经解决了这个问题。

QOpenGLWidget但是没有以相同方式更新的视口。

4

0 回答 0