Dav*_*óth 6 c++ opengl desktop qt
我尝试用Qt 5.5.1构建一个简单的OpenGL应用程序,一切都很好,直到我尝试使用像glClearColor这样的openGL本机函数调用.
Widget实际上编译并生成黑屏,但在我尝试使用任何openGL本机函数之后它甚至没有链接,但会产生错误:
glwidget.cpp:10: error: undefined reference to '_imp__glClearColor@16'
这是.pro文件:
QT += core gui opengl
CONFIG += windows
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = Vehicle_simulation
TEMPLATE = app
SOURCES += main.cpp\
simulation.cpp \
glwidget.cpp
HEADERS += simulation.h \
glwidget.h
FORMS += simulation.ui
Run Code Online (Sandbox Code Playgroud)
我正在使用Desktop Qt mingw492_32套件.奇怪的是,我没有在lib文件夹中找到libQtOpenGL.so.我的QT安装有问题吗?我试图多次重新安装它,但它没有帮助.我在哪里可以下载该特定库?
将它链接到项目将解决问题,但我似乎无法在任何地方找到它.
问题是QT安装中缺少openGL模块,并不是我无法链接到它.
我偶然打开一个示例程序后,只是看一下实现; 我发现QOpenGLWidget
在新的示例程序中已经实现了相同的功能.
经过一番分析后,我设法找出问题所在.
QT还具有内部openGL实现和本机openGL支持.我使用的小部件继承自QOpenGLWidget
,但openGL函数调用(如glClearColor
)尝试访问Qt中的本机openGL实现.由于那些不包含在我的Qt版本中,该项目无法构建.
要解决此问题,必须运行自定义Qt核心构建,或使用Qt提供的openGL包装器.
我最后使用了Qt包装器,它也被示例程序Cube使用.用于实现小部件的类(GLWidget
在我的实现中调用)不仅要继承QOpenGLWidget
,还要继承QOpenGLFunctions
.我的实施中缺少后一部分.它的源代码如下:
glwidget.h(初始):
#ifndef GLWIDGET_H
#define GLWIDGET_H
#include <QOpenGLFunctions>
#include <QOpenGLWidget>
class GLWidget : public QOpenGLWidget
{
Q_OBJECT
public:
explicit GLWidget(QWidget *parent);
protected:
void initializeGL();
void paintGL();
void resizeGL(int w, int h);
};
#endif // GLWIDGET_H
Run Code Online (Sandbox Code Playgroud)
glwidget.h(已修复):
#ifndef GLWIDGET_H
#define GLWIDGET_H
#include <QOpenGLFunctions>
#include <QOpenGLWidget>
class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
Q_OBJECT
public:
explicit GLWidget(QWidget *parent);
protected:
void initializeGL() Q_DECL_OVERRIDE;
void paintGL() Q_DECL_OVERRIDE;
void resizeGL(int w, int h) Q_DECL_OVERRIDE;
};
#endif // GLWIDGET_H
Run Code Online (Sandbox Code Playgroud)
在使用任何gl*函数之前initializeOpenGLFunctions();
,必须调用该函数,否则会弹出非常神秘的运行时错误.即:
void GLWidget::initializeGL(){
initializeOpenGLFunctions();
glClearColor(1,0,0,1);
}
Run Code Online (Sandbox Code Playgroud)
希望这对其他人也有帮助.