2012-12-04 34 views
1

我使用Qt4在OpenGL中做了一個簡單的三角形,它工作正常,直到我使用set format來啓用多重採樣。這裏是我的代碼:QGLWidget:使用setFormat()來啓用Multisampling =窗口不關閉

#include <QApplication> 
#include <QtOpenGL> 
// gl window class 
class GLWindow : public QGLWidget 
{ 
public: 
    GLWindow(QWidget *parent = nullptr) 
     : QGLWidget(parent){} 
protected: 
    // ALL THE FOLLOWING FUNCTIONS ARE OVERRIDDEN FROM QGLWIDGET 
    void initializeGL() 
    { 
     QGLFormat newFormat = this->format(); 
     newFormat.setSampleBuffers(true); 
     newFormat.setSamples(16); 
     this->setFormat(newFormat); 
    } 
    void resizeGL(int w, int h) 
    { 
     glViewport(0, 0, w, h); 
     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     glOrtho(-1, 1, -1, 1, -1, 1); 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
    } 
    void paintGL() 
    { 
     glClear(GL_COLOR_BUFFER_BIT); 
     glBegin(GL_TRIANGLES); 
      glColor3f(1, 0, 0); 
      glVertex2f(0, 1); 
      glColor3f(0, 1, 0); 
      glVertex2f(1, -1); 
      glColor3f(0, 0, 1); 
      glVertex2f(-1, -1); 
     glEnd(); 
    } 
}; 
// main function 
int main(int argc, char **argv) 
{ 
    QApplication app(argc, argv); 
    GLWindow window; 
    window.resize(640, 480); 
    window.show(); 
    return app.exec(); 
} 

之前我添加的格式的東西,在「initlializeGL」,它工作得很好(顯然除了沒有多重採樣)。

然後,我添加格式的東西,窗口不關閉。當我這樣說時,我的意思是說,當我按下右上角的「X」按鈕時它不會關閉,或者當我調用窗口的「close()」函數時它甚至不會關閉。

此外,當您按下「X」按鈕(我選中)時會調用「closeEvent()」,但實際上沒有任何關閉。我嘗試在覆蓋的「closeEvent()」函數內調用「close()」,但它什麼也沒做。

再次,我刪除「initializeGL()」中的代碼,然後它關閉罰款。所以,我嘗試將「initializeGL()」中的代碼移入構造函數中。多重採樣工作,並且當我按下「X」時關閉。大!除非我得到這個窗口後關閉:

enter image description here

所以這是。簡而言之:

  • 當「initializeGL()」中沒有「setFormat()」相關代碼時,一切正常。
  • 當我把「setFormat()」相關代碼放在「initializeGL()」中時,窗口不關閉。
  • 當我把我的「setFormat()」相關代碼放在構造函數中時,當窗口關閉時,出現上圖中顯示的怪異錯誤;

那麼,如何讓窗口關閉,同時保持多重採樣啓用,並沒有得到一些愚蠢的錯誤後窗戶關閉?

編輯:這裏是我的.pro文件

QT += core 
QT += gui 
QT += opengl 

SOURCES += \ 
    main.cpp 

回答

3

文本不應從​​調用setFormat,因爲它觸發調用​​本身。而且由於Qt 4.8中的QGLWidget::setFormatobsolete,所以你根本不應該使用它。因此,首先嚐試從構造函數調用setFormat,然後,如果它不起作用(或者即使它起作用),嘗試將格式從main()傳遞給QGLWidget的構造函數。

+0

太棒了,我將格式傳遞給QGLWidget的構造函數,它現在可以工作!非常感謝:D – Aaron