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);
}
我遠離這方面的專家,但:小部件是否需要顯式添加到屬於窗口的佈局? – mjwach
不確定明白你的意思,但我確實希望窗口部件有一個父窗口 – bisthebis
我的意思是這樣的(也許使用QBoxLayout以外的佈局類型,如果你喜歡的話):auto layout = new QBoxLayout(QBoxLayout ::從上到下); window.setLayout(佈局);布圖設計> addWidget(GL); – mjwach