2016-04-20 50 views
2

所以,我一直在用OpenGL支付一段時間,現在我想遷移到Qt,所以我可以在窗口中嵌入小部件。 由於我需要Qt Widgets,我不想使用QWindow;因此我使用了放入容器窗口的QGLWidget。 我確實設法創建了正確的上下文並設置了一個清晰的顏色,但我沒有設法繪製任何東西。帶窗口小部件的Qt OpenGL:出了什麼問題?

你能幫我理解爲什麼嗎? (順便說一句,我覺得我做的髒東西如果你有什麼清潔劑來告訴我,讓我到嵌入GL表面作爲窗口小部件,告訴我!)

我的主:

int main(int argc, char **argv) 
{ 
    QApplication app(argc, argv); 

    QGLFormat glFormat; 
    glFormat.setVersion(3, 3); 
    glFormat.setProfile(QGLFormat::CoreProfile); // Requires >=Qt-4.8.0 
    glFormat.setSampleBuffers(true); 

    QWidget window; 
    window.resize(1000, 800); 
    WidgetOpenGL* GL = new WidgetOpenGL(glFormat, &window); 
    GL->resize(500, 500); 
    window.show(); 

    //GL->show(); 

    return app.exec(); 
} 

WidgetOpenGL.h:

class WidgetOpenGL : public QGLWidget, protected QGLFunctions 
{ 
    Q_OBJECT 

public: 
    WidgetOpenGL(const QGLFormat& format, QWidget* parent = nullptr); 

protected: 
    void initializeGL(); 
    void paintGL(); 
    void resizeGL(int width, int height); 

signals: 

public slots : 
}; 

實現:

#include "widgetopengl.h" 

WidgetOpenGL::WidgetOpenGL(const QGLFormat& format, QWidget* parent) : QGLWidget(format, parent), QGLFunctions() 
{ 
    makeCurrent(); 
    initializeGLFunctions(context());  
} 

void WidgetOpenGL::initializeGL() 
{ 
    glClearColor(0.0f, 0.5f, 1.0f, 1.0f);  

    glEnable(GL_DEPTH_TEST);  
} 

void WidgetOpenGL::paintGL() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    float vertices[] = {-0.5, -0.5, 0.0, 0.5, 0.5, -0.5};  

    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, vertices); 
    glEnableVertexAttribArray(0); 

    glDrawArrays(GL_TRIANGLES, 0, 3); 

    glDisableVertexAttribArray(0);   
} 

void WidgetOpenGL::resizeGL(int width, int height) 
{ 
    int side = qMin(width, height); 
    glViewport((width - side)/2, (height - side)/2, side, side);  
} 
+1

我遠離這方面的專家,但:小部件是否需要顯式添加到屬於窗口的佈局? – mjwach

+0

不確定明白你的意思,但我確實希望窗口部件有一個父窗口 – bisthebis

+0

我的意思是這樣的(也許使用QBoxLayout以外的佈局類型,如果你喜歡的話):auto layout = new QBoxLayout(QBoxLayout ::從上到下); window.setLayout(佈局);布圖設計> addWidget(GL); – mjwach

回答

1

最後我發現問題(S)。

那麼,至少我已經找到了一個更好的方法來實現我想要的。

我正在使用QGLWidget和QGLFunctions,它們已被棄用。 通過使用QOpenGLWidget和QOpenGLFunctions,我得到了我想得到的。這真的很簡單,只需看看文檔