Qt 5.6 中的 Opengl

Posted

技术标签:

【中文标题】Qt 5.6 中的 Opengl【英文标题】:Opengl in Qt 5.6 【发布时间】:2016-04-06 22:39:57 【问题描述】:

我曾经使用 Qt 5.1.1,而 OpenGL 曾经可以正常工作。

现在我已经安装了 Qt 5.6,而且 OpenGL 应用程序似乎不像 5.1.1 那样简单。

GL 函数(即使将其包含在 #include <QOpenGLFunctions> 中也会返回“未定义的引用”。可能是因为它是一个非常新的版本,我找不到任何可以帮助我解决的问题。

主要问题是:如何在 Qt 5.6 版本中使用 OpenGL?任何 GL 函数都有效。

我在一些 Qt 手册示例中看到 initializeOpenGLFunctions() 使其工作,但我的代码无法识别此语句(我尝试#include 很多东西)。

代码是最基础的:


glwidget.h:

#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <QGLWidget>

class GLWidget : public QGLWidget

    Q_OBJECT
public:
    explicit GLWidget(QWidget *parent = 0);

    void initializeGL();
    void paintGL();
    void resizeGL(int w, int h);
;

#endif // GLWIDGET_H

主窗口.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui 
class MainWindow;


class MainWindow : public QMainWindow

    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
;

#endif // MAINWINDOW_H

glwidget.cpp:

#include "glwidget.h"

#include <QWidget>
#include <QOpenGLFunctions>



GLWidget::GLWidget(QWidget *parent) :
    QGLWidget(parent)




void GLWidget::initializeGL()


    glClearColor(1,1,0,1);



void GLWidget::paintGL()




void GLWidget::resizeGL(int w, int h)




main.cpp:

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])

    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();


主窗口.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    ui->setupUi(this);


MainWindow::~MainWindow()

    delete ui;


test.pro:

QT       += core gui opengl

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Test
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp \
    glwidget.cpp

HEADERS  += mainwindow.h \
    glwidget.h

FORMS    += mainwindow.ui

【问题讨论】:

【参考方案1】:

我假设您的“未定义引用错误”指向您尝试使用的 glColor() 函数。

为了能够使用QOpenGLFunctions比如glColor(),你必须让你的GLWidget也继承自QOpenGLFunctions;例如:

#include <QOpenGLFunctions>

class GLWidget: public QGLWidget, protected QOpenGLFunctions
 // ...
;

请参阅this example 了解更多详情。

注意:是strongly advise against using QGLWidget in new code支持QOpenGLWidget

【讨论】:

这不会让您访问最新的 OpenGL API。可以从 initializeGL 进行以下调用,而不是继承:“auto *ctx = QOpenGLContext::currentContext(); glf = ctx->versionFunctions();”。您可以选择另一个 API 版本,或者直接调用“ctx->functions()”或“ctx->extraFunctions()”。然后通过返回的指针访问 OpenGL 函数。

以上是关于Qt 5.6 中的 Opengl的主要内容,如果未能解决你的问题,请参考以下文章

QT Commercial 5.6 的 QT 条形图/图表

如何修复 Qt 5.6 beta 和 VS2015 的 QT VS 插件?

使用 Qt 5.5 或 5.6 打印网页的 HTML/内容

qt 5.6 怎么编译 qtWebView 或者 qtWebEngine

静态编译 Qt 5.6

如何将 Qt 5.6 与 MVS 2015 链接?