Opengl pyqt:为什么QGLWidget会受到maya事件的影响?

Opengl pyqt:为什么QGLWidget会受到maya事件的影响?,opengl,maya,qglwidget,Opengl,Maya,Qglwidget,我用QGLWidget创建了一个openGL视图。使用Maya时会出现问题。正如您在视频中看到的,当我在Maya中的modelPanel上单击并移动时,QGLWidget会被破坏。我发现选框矩形显示在我的QGLWidget上,而不是Maya上。为什么会出现这个问题 迄今为止 我试图按照你的建议编辑我的代码。但是它根本不调用makeCurrent()和doneCurrent()。我希望当我单击maya modelPanel时,它可以向我发送消息,但它没有。我错过了什么?对不起 def makeCu

我用QGLWidget创建了一个openGL视图。使用Maya时会出现问题。正如您在视频中看到的,当我在Maya中的modelPanel上单击并移动时,QGLWidget会被破坏。我发现选框矩形显示在我的QGLWidget上,而不是Maya上。为什么会出现这个问题

迄今为止 我试图按照你的建议编辑我的代码。但是它根本不调用makeCurrent()和doneCurrent()。我希望当我单击maya modelPanel时,它可以向我发送消息,但它没有。我错过了什么?对不起

def makeCurrent(self):
    import OpenGL.WGL as wgl
    print "MAKE CURRENT!!!"
    self.prevHDC = wgl.wglGetCurrentDC()
    self.prevHRC = wgl.wglGetCurretnContext()
    super(GLWidget, self).makeCurrent()
        
def doneCurrent(self):
    import OpenGL.WGL as wgl
    print "DONE CURRENT!!!"
    super(GLWidget, self).doneCurrent()
    wgl.wglMakeCurrent(self.prevHDC, self.prevHRC)

我写的和上面一样。但它甚至从未显示“消息”。

很可能Qt和Maya的事件循环正在为处理事件而斗争。Qt的paintGL做了正确的事情,并使OpenGL上下文在每次调用时都是当前的。但是,Maya不会这样做,因此Maya的绘图命令最终会出现在OpenGL上下文中

与Maya一起玩将是一件棘手的事情,因为它需要先存储哪个OpenGL/DC上下文处于活动状态,然后再切换和恢复该上下文(一旦完成了自己的操作)。您可能需要将QGLWidget和QGLContext子类化才能做到这一点

因评论而更新 从QGLWidget派生,添加两个成员
HDC m_prevHDC
HRC m_prevHRC
,覆盖makeCurrent和doneCurrent

void QMyGLWidget::makeCurrent()
{
    this->m_prevHDC = wglGetCurrentDC();
    this->m_prevHRC = wglGetCurrentContext();

    QGLWidget::makeCurrent();
}

void QMyGLWidget::doneCurrent()
{
     QGLWidget::doneCurrent();

     wglMakeCurrent(this->m_prevHDC, this->m_prevHRC);
}

然后从这个中间类派生实际的GLWidget。

谢谢您的回复。但我不明白你的答案。首先,我不知道QGLContext:(你的意思是我必须使用单bufer和swap?@Hyun geunKim:不,我的意思是,在Qt的代码中有一行wglMakeCurrent,使QGLWidgets OpenGL上下文接收所有OpenGL调用。Maya也有类似的行。问题是,Maya并不总是调用它。因此,你的程序必须还原其上下文绑定,即clean这是通过镜像GL上下文的wglMakeCurrent调用与Maya的GL上下文的wglMakeCurrent调用来完成的。wglGetCurrentContext可用于检索该调用。因为上下文绑定发生在“幕后”对于QGLWidget和QGLContext,您必须对它们进行子类化才能添加此项。最后,我得到了您的建议。我在与计时器相关的方法中尝试了类似的方法。
self.makeCurrent()
self.updateGL()
self.doneCurrent()
但是,有了此代码,Maya失去了自己的GL功能。(我无法在Maya modelPanel:()我当然不擅长OpenGL。你能帮我一个忙吗?你能帮我写一个breif伪代码吗?我找不到流程。@Hyun geunKim:请看我的代码更新。本质上,你必须创建某种事务回滚机制。