2012-07-18 98 views
1

似乎在initializeGL之前調用了QGLWidget的paintEvent方法,所以我應該在哪裏放置openGL初始化代碼?QGLWidget paintEvent:在哪裏初始化openGL?

我把它放入的paintEvent方法是這樣的:

void MyGLWidget::paintEvent(...) 
{ 
    makeCurrent(); 
    ..save modelview and projection matrices.. 

    // This is initialization code 

    GLenum init = glewInit(); 
    if (GLEW_OK != init) 
    { 
     /* Problem: glewInit failed, something is seriously wrong. */ 
     qWarning() << glewGetErrorString(init); 
    } 

    // Dark blue background 
    glClearColor(0.2f, 0.0f, 0.5f, 0.0f); 
    // Enable depth test 
    glEnable(GL_DEPTH_TEST); 


    // End initialization code 

    ... drawing code 

    QPainter painter(this); 
    ...overpainting.. 

} 

我真的不喜歡被稱爲每次的paintEvent上升時間我GLEW庫初始化函數的想法......雖然這加工。

有什麼建議嗎?

回答

2

你必須initializeGL(初始化OpenGL的),沒有其他的選擇。

但是你也必須畫在paintGL裏面,而不是在paintEvent裏面,所以這是你的錯誤所在。

+0

之前沒有調用initializeGL並從paintEvent調用updateGL? – 2012-07-18 19:37:52

+0

如果我從paintEvent調用「updateGL」,並讓initializeGL和paintGL完成這項工作,出於某種原因,屏幕呈現正常,但之後立即全部換成白色。這是爲什麼? – 2012-07-18 19:52:20

0

重寫QGLWidget的initializeGL()函數。這是創建適合您想

從它的文檔目的:

這個虛函數第一次調用之前調用一次以 paintGL()或resizeGL(),然後一旦每當小部件有已爲 分配了新的QGLContext。在一個子類中重新實現它。

鏈接到文件:http://doc.qt.io/archives/qt-4.7/qglwidget.html#initializeGL

+1

正如我所說,它似乎initializeGL被稱爲AFTER paintEvent,所以我不能繪製paintEvent沒有glew擴展和着色器設置(這應該做的,在我的愚見,進入initializeGL) – 2012-07-18 17:25:44

+0

@JohnPell:對不起,我沒有注意到這一點。你確定它是在繪畫事件之後調用的嗎?嘗試在這兩個函數中加入斷點並檢查哪一個是首先觸發的 – Andrew 2012-07-18 17:37:17

+0

@JohnPell:請參閱我的編輯 – Andrew 2012-07-18 17:46:02