qt opengl教程(编译qt5怎么配置opengl)

本文目录
- 编译qt5怎么配置opengl
- Qt5怎样使用OpenGL
- 如何在QT环境下用opengl画一个球体
- 在QT环境下用OpenGL绘制一个边长为5的立方体,并为立方体贴上自定义纹理写出实现该功能的具体
- 如何在Qt中配置OpenGL
- Qt使用OpenGL重定义的问题,有人能帮我解决吗
编译qt5怎么配置opengl
下载opengl源码。交叉编译opengl。然后把opengl的头文件,库文件包含到Qt配置的路径里,再交叉编译Qt
Qt5怎样使用OpenGL
一、Qt5中OpenGL模块的重大更改
1
在 Qt5 中,新增了 QOpenGL* 类,用以取代之前的 QGL* 类。
注意,虽然我们仍然能通过 Qt5 中的 OpenGL 模块使用 QGL* 类,但强烈建议大家在新的 Qt 应用程序中使用 QOpenGL* 类而不是 QGL* 类。
Qt5怎样使用OpenGL
2
另外,在 Qt5 中,已经将 OpenGL 集成到了 Gui 模块中。因此,我们要想使用与 OpenGL 相关的类和函数,只需要在 .pro 工程文件中包含 gui 模块就可以了,无需像以前一样还要包含 opengl 。
Qt5怎样使用OpenGL
END
二、怎样在Qt5中使用OpenGL
下面,我们来通过一个实际例子来演示怎样在 Qt5 中使用 OpenGL。在这个例子中,为了便于大家理解,我们只创建一个简单的背景为黑色的 OpenGL 窗口。下面是程序的运行效果图。
Qt5怎样使用OpenGL
首先,我们需要创建一个自定义的窗口类 Window。该类的父类有两个:
1)QOpenGLWindow:以公有方式继承
2)QOpenGLFunctions:以保护方式继承
另外,在通常情况下,我们还需要实现三个从父类继承的虚函数:
1)void initializeGL()
2)void resizeGL(int width, int height) //若无需对高、宽进行处理,此函数可省
3)void paintGL()
Qt5怎样使用OpenGL
然后,我们来实现上面所声明的函数。
1) initializeGL
该函数用来初始化当前的 OpenGL 环境。
注意,在此函数中,我们必须调用 initializeOpenGLFunctions(); 语句以便 Qt 在后台完成 OpenGL 环境的初始化工作。
随后,使用 glClearColor 函数来设置清除颜色。该函数的前三个参数分别是红、绿、蓝的分量值,第四个参数为透明度值。
Qt5怎样使用OpenGL
2)resizeGL
该函数主要用来对高度和宽度进行一些变化处理。当然,如果你没有什么特殊需求,也可以不处理这个函数。
Qt5怎样使用OpenGL
3)paintGL
该函数才是重头戏,绘制一般在此函数内进行。在这里,作为示范,我们只是简单地用之前设置的清除颜色来清除窗口背景。
Qt5怎样使用OpenGL
最后,我们添加一个 main.cpp 文件,在主函数中新建一个 Window 类对象,然后将其显示出来。啊哈,纵观整个过程,相比之前的 Qt 版本,在 Qt5 中使用 OpenGL 是不是超级简单呢?
Qt5怎样使用OpenGL
如何在QT环境下用opengl画一个球体
语法也有错误:glVertex3fv(&vdata );
改为:
glVertex3fv(vdata );
glVertex3fv(vdata );
glVertex3fv(vdata );
我的运行环境是在QT IDE上运行的。4.7.0版。
如果你是在VC上运行应该也要加入opengl32,glut,glut32库(32位WIN上的),
另外,这个程序你是看不到一个球体的,因为你没有使用光照,只能看到一个轮廓。
我的Qt上我加入的库是:opengl32,glut,glee5(glee5是glee是自己编译的替换glut32库)
头加入了:windown.h,gl/glee.h(glee.h就是glee的头文件在网上可以下载,比gl.h要高级,因为WIN上的gl.h只支持到opengl32的1.1版)
在QT环境下用OpenGL绘制一个边长为5的立方体,并为立方体贴上自定义纹理写出实现该功能的具体
void MyGLWidget::loadGLTexture()
{
QImage image(":/dog.jpg");
image = image.convertToFormat(QImage::Format_RGB888);
image = image.mirrored();
glGenTextures(1, &mTexture);
glBindTexture(GL_TEXTURE_2D,mTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
image.width(), image.height(), 0,
GL_RGB, GL_UNSIGNED_BYTE,
image.bits());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
void MyGLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 清除屏幕和深度缓存
glLoadIdentity();// 重置当前的模型观察矩阵
glTranslatef(0.0f,0.0f,-5.0f);// 移入屏幕 5 个单位
//下面三行使立方体绕X、Y、Z轴旋转。旋转多少依赖于变量 xrot , yrot 和 zrot 的值。
glRotatef(mXRotate,1.0f,0.0f,0.0f);// X轴旋转
glRotatef(mYRotate,0.0f,1.0f,0.0f);// Y轴旋转
glRotatef(mZRotate,0.0f,0.0f,1.0f);// Z轴旋转
//下一行代码选择我们使用的纹理。
//如果您在您的场景中使用多个纹理,您应该使用来 glBindTexture(GL_TEXTURE_2D, texture) 选择要绑定的
//纹理。当您想改变纹理时,应该绑定新的纹理。有一点值得指出的是,您不能在 glBegin() 和 glEnd() 之间绑定纹理,必须在 glBegin()
//之前或 glEnd() 之后绑定。注意我们在后面是如何使用 glBindTexture 来指定和绑定纹理的。
glBindTexture(GL_TEXTURE_2D, mTexture);// 选择纹理
//为了将纹理正确的映射到四边形上,您必须将纹理的右上角映射到四边形的右上角,纹理的左上角映射到四边形的左上角,
//纹理的右下角映射到四边形的右下角,纹理的左下角映射到四边形的左下角。
//如果映射错误的话,图像显示时可能上下颠倒,侧向一边或者什么都不是。
//glTexCoord2f 的第一个参数是X坐标。 0.0f 是纹理的左侧。 0.5f 是纹理的中点, 1.0f 是纹理的右侧。
//glTexCoord2f 的第二个参数是Y坐标。 0.0f 是纹理的底部。 0.5f 是纹理的中点, 1.0f 是纹理的顶部。
//所以纹理的左上坐标是 X:0.0f,Y:1.0f ,四边形的左上顶点是 X: -1.0f,Y:1.0f 。其余三点依此类推。
//试着玩玩 glTexCoord2f X, Y坐标参数。把 1.0f 改为 0.5f 将只显示纹理的左半部分,把 0.0f 改为 0.5f 将只显示纹理的右半部分。
glBegin(GL_QUADS);
// 前面
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);// 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);// 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);// 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);// 纹理和四边形的左上
// 后面
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);// 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);// 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);// 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);// 纹理和四边形的左下
// 顶面
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);// 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);// 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);// 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);// 纹理和四边形的右上
// 底面
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);// 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);// 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);// 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);// 纹理和四边形的右下
// 右面
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);// 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);// 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);// 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);// 纹理和四边形的左下
// 左面
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);// 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);// 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);// 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);// 纹理和四边形的左上
glEnd();
}
void MyGLWidget::timerEvent(QTimerEvent *event)
{
//现在增加 xrot , yrot 和 zrot 的值。尝试变化每次各变量的改变值来调节立方体的旋转速度,或改变+/-号来调节立方体的旋转方向。
mXRotate += 0.3f;// X 轴旋转
mYRotate += 0.2f;// Y 轴旋转
mZRotate += 0.4f;// Z 轴旋转
updateGL();
QGLWidget::timerEvent(event);
}
void MyGLWidget::keyPressEvent(QKeyEvent *event)
{
switch (event-》key()) {
case Qt::Key_F2:
{
mFullScreen = !mFullScreen;
if(mFullScreen) {
showFullScreen();
}
else {
showNormal();
}
updateGL();
break;
}
case Qt::Key_Escape:
{
qApp-》exit();
break;
}
}
}
#include "myglwidget.h"
#include 《QApplication》
int main(int argc, char *argv)
{
QApplication a(argc, argv);
MyGLWidget w;
w.show();
return a.exec();
————————————————
版权声
如何在Qt中配置OpenGL
0.把所有以QGL开头的.h都去掉,那都是过时API
1.从5.5开始,QOpenGL在core里了,不需要另外+=了。
2.去掉glut。虽然理论上glut的函数可以直接使用,但有时仍有版本和兼容问题,而且不能利用qt的调试log。
3.QOpenGL的函数不是include了就能直接用的,也要get context。
4.仍然建议使用QOpenGLWidget,它会自动管理context。
为了获得context,要使用QOpenGLContext
f = QOpenGLContext::currentContext()-》versionFunctions《QOpenGLFunctions_4_5_Core》();
f-》initializeOpenGLFunctions();
然后f-》gl函数即可。
这个是写在QOpenGLWidget的initialize里的,不清楚直接写在程序里会是什么结果。
话说文档里都有,能看得懂自己翻就明白了呀。
Qt使用OpenGL重定义的问题,有人能帮我解决吗
解决Qt QOpenGl中方法未定义的问题:
用Qt中的QGLWidget窗体类中是不包括glut工具库的,难怪在myGLWidget(在我的程序中是QGLWidget的派生类)中绘制实心球体是说“glutSolidSphere”: 找不到标识符,就是说没有这个函数的声明。接下来就来安装glut库:
***隐藏网址***
2.将下载下来的文件解压,将glut32.lib和glut.lib两个lib文件移到qt目录下的./lib文件夹中。
3.将glut.dll和glut32.dll两个动态链接库移到C:\windows\system32中。
4.将glut.h文件移到qt目录下的\include\QtOpenGL中,并建立glut文件(不要后缀),这样就将glut安装好了,切换到在自己的程序中,在myGLWidget.cpp(QGLWidget派生类的cpp)加入“#include《glut》”,这样就可以使用glut中的函数了。
方法步骤4中,建立glut文件的过程,是这样的:在qt目录下的\include\QtOpenGL目录下,新建一个txt文件,里面输入代码:#include “glut.h”,然后把该txt文件的名字重命名为glut,注意这个地方不需要加后缀。另外需要特别注意的是,虽然我们把glut.h文件放入在qt目录下的\include\QtOpenGL下,且我们也在GLWidget.cpp中也加入了头文件#include《QtOpenGL》,但是因为QtSDK库编译的原因,我们在GLWidget.cpp中仍然需要添加#include《glut》语句才行。

更多文章:
在from子句中可以出现(如何在from 子句中嵌套查询下面的语句在access中出错!)
2026年10月11日 05:20
countif函数统计个数怎么用(countif函数怎么用 详解Excel中countif函数的使用方法)
2026年10月11日 03:30
正则匹配数字之前的字符(正则表达式如何匹配前面是数字、中间是“/”、后面也是数字,就像2/3专业的模式)
2026年10月11日 03:00
orlnsertbootmediinselected(我电脑开机显示这个是什么意思or insert boot media in select)
2026年10月10日 23:00
display的用法(display是什么意思 详解display的含义和用法)
2026年10月10日 22:00
html全部居中代码(怎么让网页居中显示,html如何让网页居中)
2026年10月10日 21:10





