2012-11-09 35 views
0

openGL with mayapyqt:爲什麼QGLWidget受瑪雅事件的影響?

我用QGLWidget做了一個openGL視圖。與Maya合作時遇到問題。正如你在視頻中看到的那樣,當我點擊並在Maya中的modelPanel上移動時,QGLWidget就會崩潰。我發現在我的QGLWidget上顯示的是選框矩形,而不是Maya。爲什麼會出現這個問題?

到datenwolf

我試圖按照您的建議編輯我的代碼。但是......它根本不調用makeCurrent()和doneCurrent()。我希望當我點擊我的maya模型面板時,它可以向我發送消息,但事實並非如此。我錯過了什麼?對不起。

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) 

我寫得和上面一樣。但它甚至不顯示「MESSAGE」。

回答

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。

+0

謝謝您的回覆。但我無法理解你的答案。首先,我不知道緊靠QGLContext :(你的意思是,我不得不使用單緩衝溶液和交換 –

+1

@炫geunKim嗎?不,我的意思是,在Qt的代碼某個地方有一條線wglMakeCurrent,使QGLWidgets OpenGL上下文接收所有的OpenGL調用,Maya也有類似的問題,Maya不會一直調用它,所以你的程序必須恢復它的上下文綁定,也就是清理它自己,這是通過鏡像來完成的該wglMakeCurrent呼籲用wglMakeCurrent調用Maya的GL上下文的GL上下文。wglGetCurrentContext可用於檢索。由於上下文結合發生QGLWidget來繪圖和QGLContext的「幕後」你要繼承他們增加這一點。 – datenwolf

+0

在最後,我得到了你的建議,我想一樣,在我的定時器相關的方法。 'self.makeCurrent()'' self.updateGL()'' self.doneCurrent()' 但是,有了這段代碼,Maya就釋放了它自己的GL作品。 (我不能瑪雅modelPanel :(繪製選框)當然我窮在OpenGL的 –

相關問題