VS2008集成QT的OpenGL开发(实现二维图形的旋转)

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/details/78148300 ...
版权声明:本文为博主原创文章,未经博主允许不得转载。更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/details/78148300

主要是利用Qt中的定时器实现了二维图形的旋转功能:

#ifndef QGLTEST_H
#define QGLTEST_H

#include <QGLWidget>
#include <qgl.h>
#include <QKeyEvent>
#include <GL/GL.H>
#include <GL/GLU.H>
#include <GL/GLUT.H>

class QGLTest : public QGLWidget
{
	Q_OBJECT

public:
	QGLTest(QWidget* parent = 0, const char* name = 0, bool fs = false);
	~QGLTest();

protected:
	//初始化窗口组件
	void initializeGL();
	//绘制OpenGL窗口(只要有更新就会被调用)
	void paintGL();
	//处理窗口变化的事件
	void resizeGL(int width, int height);
	
	//按键按下的触发事件
	void keyPressEvent(QKeyEvent *e);

	//定时器的使用(函数的重写, 先继承, 后重写)
	void timerEvent(QTimerEvent *event);

protected:
	bool fullscreen;		//是否全屏
	GLfloat rTri;			//三角形的旋转
	GLfloat rQuad;			//矩形的旋转
};

#endif // QGLTEST_H


#include "qgltest.h"

//构造函数(对QGLTest下面的有参构造函数进行初始化操作, 而QGLTest这个类本身是继承自QGLWidget)
QGLTest::QGLTest(QWidget* parent, const char* name, bool fs)
	: QGLWidget(parent)
{
	//设置窗口全屏
	fullscreen = fs;
	
	//初始化参数
	rTri = 0.0;
	rQuad = 0.0;

	//设置窗口的位置(左上0,0; 640*480)
	setGeometry(0, 0, 640, 480);
	//设置窗口的标题
	setWindowTitle("Nehe's OpenGL framwork Testing…………");

	if (fullscreen)
	{
		showFullScreen();
	}

	//这也是成员函数
	startTimer(50);
}


//析构函数
QGLTest::~QGLTest()
{

}


//OpenGL窗口创建之后会调用该函数
void QGLTest::initializeGL()
{
	setGeometry(300, 150, 640, 480);
	//启动阴影平滑(阴影平滑通过多边形精细的混合色彩,并对外部光进行平滑)
	glShadeModel(GL_SMOOTH);
	//设置清除屏幕的时候使用的颜色(RGBA)
	glClearColor(0.0, 0.0, 0.0, 0.5);
	//设置深度缓存(深度缓存不断的对物体进入屏幕内部有多深进行跟踪,它的排序决定那个物体先画)
	glClearDepth(1.0);

	//开启深度测试
	glEnable(GL_DEPTH_TEST);
	//开启深度测试的类型
	glDepthFunc(GL_LEQUAL);
	//启用真正精细的透视修正
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}

//重置当前的窗口
void QGLTest::resizeGL(int width, int height)
{
	if (0 == height)
	{
		height = 1;
	}
	//重置当前的视口
	glViewport(0, 0, (GLint)width, (GLint)height);

	//选择投影矩阵(透视效果)
	glMatrixMode(GL_PROJECTION);
	//重置投影矩阵
	glLoadIdentity();
	//建立透视投影矩阵(视角, 实际窗口纵横比, 相机能看见的最近距离和最远距离)
	gluPerspective(45.0, (GLfloat)width / (GLfloat)height, 0.1, 100.0);

	//选择模型观察矩阵(模型观察矩阵中存放了我们的物体讯息)
	glMatrixMode(GL_MODELVIEW);
	//重置模型观察矩阵
	glLoadIdentity();
}


//实现我的绘图函数
void QGLTest::paintGL()
{
	//清除屏幕和深度缓存
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	//重置当前的模型观察矩阵
	glLoadIdentity();
	//绘制一个矩形和一个三角形
	glTranslatef(-1.5, 0.0, -6.0);
	//开始旋转
	glRotatef(rTri, 0.0, 1.0, 0.0);

	glBegin(GL_TRIANGLES);
	glColor3f(1.0, 0.0, 0.0);
	glVertex3f( 0.0,  1.0,  0.0);	 //上顶点
	glColor3f(0.0, 1.0, 0.0);
	glVertex3f(-1.0, -1.0,  0.0 );  //左下
	glColor3f(0.0, 0.0, 1.0);
	glVertex3f( 1.0, -1.0,  0.0 );  //右下
	glEnd();
	
	//矩形绕着x轴旋转
	glLoadIdentity();
	glTranslatef(1.5, 0.0, -6.0);
	glRotatef(rQuad, 1.0, 0.0, 0.0);

	glColor3f(0.5, 0.5, 1.0);
	glBegin(GL_QUADS);
	glVertex3f(-1.0,  1.0, 0.0);
	glVertex3f( 1.0,  1.0, 0.0);
	glVertex3f( 1.0, -1.0, 0.0);
	glVertex3f(-1.0, -1.0, 0.0);
	glEnd();

}




//对按键的处理
void QGLTest::keyPressEvent(QKeyEvent *e)
{
	switch (e->key())
	{
		//按下F2按键全屏
	case Qt::Key_F2:
		fullscreen = !fullscreen;
		if (fullscreen)
		{
			//开始全屏(只对顶级窗口有效)
			showFullScreen();
		}
		else
		{
			//设置为顶级窗口模式
			showNormal();
			//重置窗口(恢复原始窗口)
			setGeometry(0, 0, 640, 480);
		}

		//updateGL()会调用paintGL()实现更新
		updateGL();
		break;

		//按下ESC会退出
	case Qt::Key_Escape:
		close();
	}
}

此时如果直接运行, 效果如下:




发现并没有旋转,几经周折后,添加一个定时器, 即可实现旋转:

//定时器的使用(::表示对一个类的成员函数进行实现)
void QGLTest::timerEvent(QTimerEvent *event)
{
	//改变旋转的角度
	rTri += 2;
	rQuad -= 15;

	updateGL();
	//开始递归调用
	//QGLWidget::timeEvent(event);  //error: “timeEvent”: 不是“QGLWidget”的成员
	QGLWidget::timerEvent(event);
}




相关文章
|
1月前
|
网络协议 C++
C++ Qt开发:QTcpSocket网络通信组件
`QTcpSocket`和`QTcpServer`是Qt中用于实现基于TCP(Transmission Control Protocol)通信的两个关键类。TCP是一种面向连接的协议,它提供可靠的、双向的、面向字节流的通信。这两个类允许Qt应用程序在网络上建立客户端和服务器之间的连接。Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QTcpSocket`组件实现基于TCP的网络通信功能。
37 8
C++ Qt开发:QTcpSocket网络通信组件
|
1月前
|
存储
QT图形视图框架绘制曲线图和Smith图
QT图形视图框架绘制曲线图和Smith图
17 0
|
22天前
|
数据可视化 图形学 开发者
【Qt 底层机制之图形渲染引擎】深入理解 Qt 的 渲染机制:从基础渲染到高级图形
【Qt 底层机制之图形渲染引擎】深入理解 Qt 的 渲染机制:从基础渲染到高级图形
143 4
|
17天前
qt开发使用camera类获取摄像头信息并拍照保存
qt开发使用camera类获取摄像头信息并拍照保存
|
24天前
|
Linux API iOS开发
【Qt 渲染引擎】一文带你了解qt的三种 渲染引擎,包括栅格引擎(Raster)、OpenGL 和本地绘图系统
【Qt 渲染引擎】一文带你了解qt的三种 渲染引擎,包括栅格引擎(Raster)、OpenGL 和本地绘图系统
20 0
|
27天前
|
监控 C++
C++ Qt开发:QProcess进程管理模块
Qt是一个跨平台的C++图形库,简化了窗体应用开发,支持通过拖放组件提升效率。本章节关注`QProcess`组件,它用于控制和管理进程,例如执行命令、运行可执行文件及与外部进程通信。`QProcess`提供多种方法如`start`、`waitForStarted`和`waitForFinished`等,实现启动、监控和交互。示例展示了如何使用`QProcess`获取系统进程和信息,通过`tasklist`和`systeminfo`命令,并将结果展示在`QTreeWidget`中。
28 0
C++ Qt开发:QProcess进程管理模块
|
29天前
|
机器学习/深度学习 API vr&ar
Qt, OpenCV与OpenGL协同作战:图像处理与三维图形界面的完美结合
Qt, OpenCV与OpenGL协同作战:图像处理与三维图形界面的完美结合
105 4
|
29天前
|
存储 C++ 网络架构
C++ Qt开发:QUdpSocket实现组播通信
Qt教程:使用`QUdpSocket`实现UDP组播通信。通过设置套接字选项、绑定端口、加入和离开组播组,以及发送和接收数据报,简化跨平台窗体应用开发。关键函数包括`setSocketOption`设置多播TTL,`bind`绑定地址和端口,`joinMulticastGroup`加入组播,`leaveMulticastGroup`退出,`writeDatagram`发送,和`readDatagram`接收数据报。
16 1
C++ Qt开发:QUdpSocket实现组播通信
|
30天前
|
存储 网络安全 C++
C++ Qt开发:QUdpSocket网络通信组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QUdpSocket`组件实现基于UDP的网络通信功能。与`QTcpSocket`组件功能类似,`QUdpSocket`组件是 Qt 中用于实现用户数据报协议(UDP,User Datagram Protocol)通信的类。UDP 是一种无连接的、不可靠的数据传输协议,它不保证数据包的顺序和可靠性,但具有低延迟和简单的特点。
19 0
C++ Qt开发:QUdpSocket网络通信组件
|
1月前
|
数据可视化 数据库 C++
Qt 5.14.2揭秘高效开发:如何用VS2022快速部署Qt 5.14.2,打造无与伦比的Windows应用
Qt 5.14.2揭秘高效开发:如何用VS2022快速部署Qt 5.14.2,打造无与伦比的Windows应用

热门文章

最新文章

推荐镜像

更多