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以上是关于Qt 5.6 中的 Opengl的主要内容,如果未能解决你的问题,请参考以下文章
如何修复 Qt 5.6 beta 和 VS2015 的 QT VS 插件?