我正在使用QGLWidget从Qt 4.8到Qt 5.5进行迁移。
我的错误是“无法使QOpenGLContext在另一个线程中保持最新状态。”
我对这个错误的理解是,正如错误所说,openGL上下文只能绑定到一个线程,只有这个线程可以使用上下文。
旧代码就像:
myQGLWidget->makeCurrent();
.. some openGL
myQGLWidget->doneCurrent();
这在Qt 4.8中工作,有一些线程锁定以避免并发调用“makeCurrent”。
在阅读了关于这个主题的所有内容之后,我的最后一次尝试是:
myQGLWidget->context()->moveToThread(QThread::currentThread());
myQGLWidget->context()->makeCurrent();
... openGL again
myQGLWidget->context()->doneCurrent();
我仍然得到同样的错误......
我对它应该如何工作有点困惑,有人可以帮助我吗?
问候,
答案 0 :(得分:2)
错误是两件事的结合:
makeCurrent
与("亲和力"这里是QObject概念)具有亲和力。如果您控制两个线程,最好的办法可能就是创建一个新的QGLContext
,与您的QGLWidget上下文共享;然后移动并使用这个新的上下文到线程中。你仍然需要你已经拥有的锁定 - 你不能在同一个表面上制作两个上下文。
更一般地说,这被认为是QOpenGLContext的限制。我已经为Qt 5.8准备了一个试图摆脱它的补丁,你可以找到它here。