c++ - 带小部件的 Qt OpenGL : what's wrong?

标签 c++ qt opengl

所以,我使用 OpenGL 已经有一段时间了,现在我想迁移到 Qt,这样我就可以在我的窗口中嵌入小部件。 因为我需要 Qt Widgets,所以我不想使用 QWindow;因此我使用放在容器窗口中的QGLWidget。 我确实设法创建了正确的上下文并设置了清晰的颜色,但我没有设法绘制任何东西。

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

最佳答案

终于找到问题了(S)

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

我使用的是已弃用的 QGLWidget 和 QGLFunctions。 通过使用 QOpenGLWidget 和 QOpenGLFunctions,我得到了我想要的。很简单,看文档就可以了

关于c++ - 带小部件的 Qt OpenGL : what's wrong?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36751067/

相关文章:

c++ - 停止长 sleep 线程

qt - QAbstractListModel和QList适配器

c++ - 英特尔高清显卡-帧缓冲区不完整?

Iphone 应用程序 PNG 序列动画 - 如何在不崩溃的情况下以最佳方式使用 OPENgle

c++ - 用自己的版本替换 std::async 但 std::promise 应该住在哪里?

c++ - 什么是 `int foo::*bar::*` ?

c++ - ATL COM 代码在升级到 VS2015 时无法编译

c++ - Linux 上 HTML Web 客户端的 QT REST 开发

qt - 为什么 QML MediaPlayer/VideoOutput 对我不起作用?

c++ - glReadPixels depth_buffer_component 总是返回 1