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

时间:2012-11-09 10:38:34

标签: opengl maya qglwidget

openGL with maya

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

至datenwolf

我尝试按照您的建议编辑我的代码。但是......它根本不会调用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)

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

1 个答案:

答案 0 :(得分:0)

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

与Maya一起玩将会很棘手,因为它需要存储哪些OpenGL / DC上下文在切换和恢复之前处于活动状态,一旦完成一个自己的操作。您可能需要继承QGLWidget和QGLContext来执行此操作。

由于评论而更新

从QGLWidget派生,添加两个成员HDC m_prevHDCHRC 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。