Qt QOpenGLWidget在更新()时停止重新绘制

Qt QOpenGLWidget在更新()时停止重新绘制,qt,qt5,qt5.7,Qt,Qt5,Qt5.7,我有一个自定义QDialog,它包含一个层次结构,其中包含4个独立的QOpenGLWidget实例 每个QOpenGLWidget都有自己的GL上下文,并渲染不同的场景 我有一个循环,定期在每个QOpenGLWidget上调用update()(重新绘制它们的推荐方法)(更定期地调用重点循环,但我认为这与问题无关) 我的问题是,经过随机的时间(有时发生得很快,有时10分钟以上不会发生),调用update()时,一个或多个QOpenGLWidget将停止重新绘制 但是,我注意到,调整暂停的QOpen

我有一个自定义QDialog,它包含一个层次结构,其中包含4个独立的
QOpenGLWidget
实例

每个
QOpenGLWidget
都有自己的GL上下文,并渲染不同的场景

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

我的问题是,经过随机的时间(有时发生得很快,有时10分钟以上不会发生),调用
update()
时,一个或多个
QOpenGLWidget
将停止重新绘制

但是,我注意到,调整暂停的
QOpenGLWidget
的大小会触发一个重绘事件

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

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

QApplication::sync()
添加到触发
update()
的方法中也没有什么区别

我倾向于认为,当可用的ram较少时,这种情况会发生得更多,但是ram的数量在800mb左右,并且应用程序使用的内存明显少于这个数量。所以我的直觉可能是错的

我不是QT的大用户,所以我不太确定从这里进一步调试这个问题,欢迎任何建议。考虑到错误的可再现性包括等待未知的时间长度和更复杂的多线程项目,无法想象尝试用一小段代码重现错误会有多大好处


更新: 在
qgraphicscene
上调用
update()
时遇到了完全相同的问题,但是每次只进行了几次更新

找到了使用
viewport()->update()
更新视口的建议,似乎已解决了该问题

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