Qt OpenGL with Widgets:怎么了?

Qt OpenGL with Widgets : what's wrong?

本文关键字:怎么了 Widgets OpenGL with Qt      更新时间:2023-10-16

所以,我已经用OpenGL支付了一段时间,现在我想迁移到Qt,这样我就可以在窗口中嵌入小部件了。由于我需要Qt小工具,我不想使用QWindow;因此我使用了放在容器窗口中的CCD_ 2。我确实设法创建了一个正确的上下文并设置了一个清晰的颜色,但我什么都没画出来。

你能帮我理解为什么吗?(顺便说一句,我觉得我在做一些肮脏的事情。如果你有更干净的东西告诉我,可以让我将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();
}

小工具OpenGL.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);    
}

最后我发现了问题(S)。

好吧,至少我找到了一个更好的方法来实现我想要的。

我使用的是QGLWidget和QGLFunctions,它们已被弃用。通过使用QOpenGLWidget和QOpenGLFunctions,我得到了我想要得到的东西。这真的很简单,只需要查看文档