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);
}




相关文章
|
2月前
|
JavaScript 前端开发 持续交付
Prettier 高级应用:集成 CI/CD 流水线与插件开发
【10月更文挑战第18天】Prettier 是一款流行的代码格式化工具,它能够自动将代码格式化成一致的风格,从而提高代码的可读性和维护性。对于希望进一步发挥 Prettier 潜力的高级用户而言,将 Prettier 集成到持续集成(CI)和持续部署(CD)流程中,确保每次提交的代码都符合团队标准,是非常重要的。此外,通过开发自定义插件来支持更多语言或扩展 Prettier 的功能也是值得探索的方向。本文将详细介绍这两方面的内容。
55 2
|
27天前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
36 2
|
28天前
|
传感器 前端开发 Android开发
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求。本文深入探讨了插件开发的基本概念、流程、集成方法、常见类型及开发实例,如相机插件的开发步骤,同时强调了版本兼容性、性能优化等注意事项,并展望了插件开发的未来趋势。
39 2
|
2月前
|
Dart Android开发
鸿蒙Flutter实战:03-鸿蒙Flutter开发中集成Webview
本文介绍了在OpenHarmony平台上集成WebView的两种方法:一是使用第三方库`flutter_inappwebview`,通过配置pubspec.lock文件实现;二是编写原生ArkTS代码,自定义PlatformView,涉及创建入口能力、注册视图工厂、处理方法调用及页面构建等步骤。
68 0
|
2月前
|
开发框架 监控 搜索推荐
GoFly快速开发框架集成ZincSearch全文搜索引擎 - Elasticsearch轻量级替代为ZincSearch全文搜索引擎
本文介绍了在项目开发中使用ZincSearch作为全文搜索引擎的优势,包括其轻量级、易于安装和使用、资源占用低等特点,以及如何在GoFly快速开发框架中集成和使用ZincSearch,提供了详细的开发文档和实例代码,帮助开发者高效地实现搜索功能。
193 0
|
5月前
|
Linux Apache C++
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
该文介绍了如何在Windows环境下为FFmpeg集成SRT协议支持库libsrt。首先,需要安装Perl和Nasm,然后编译OpenSSL。接着,下载libsrt源码并使用CMake配置,生成VS工程并编译生成srt.dll和srt.lib。最后,将编译出的库文件和头文件按照特定目录结构放置,并更新环境变量,重新配置启用libsrt的FFmpeg并进行编译安装。该过程有助于优化直播推流的性能,减少卡顿问题。
141 2
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
|
3月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
160 0
|
4月前
|
开发者 存储 API
Xamarin 云服务集成竟然如此强大,简化后端开发不再是梦,数据存储、用户认证、推送通知全搞定!
【8月更文挑战第31天】Xamarin 是一款强大的跨平台移动应用开发工具,通过与云服务集成,显著简化了后端开发。开发者无需自行搭建服务器,即可利用云服务提供的数据存储、用户认证、推送通知等功能,大幅减少数据库设计、服务器配置及 API 开发的时间成本。借助 Azure Mobile Apps 等云服务,Xamarin 可轻松实现数据存取操作,同时增强应用安全性与用户参与度,使开发者更专注于业务逻辑和用户体验,提升开发效率并降低成本。这种方式在快速发展的移动应用领域极具价值。
62 0
|
4月前
|
数据库 开发者 Java
颠覆传统开发:Hibernate与Spring Boot的集成,让你的开发效率飞跃式提升!
【8月更文挑战第31天】在 Java 开发中,Spring Boot 和 Hibernate 已成为许多开发者的首选技术栈。Spring Boot 简化了配置和部署过程,而 Hibernate 则是一个强大的 ORM 框架,用于管理数据库交互。将两者结合使用,可以极大提升开发效率并构建高性能的现代 Java 应用。本文将通过代码示例展示如何在 Spring Boot 项目中集成 Hibernate,并实现基本的数据库操作,包括添加依赖、配置数据源、创建实体类和仓库接口,以及在服务层和控制器中处理 HTTP 请求。这种组合不仅简化了配置,还提供了一套强大的工具来快速开发现代 Java 应用程序。
284 0
|
4月前
|
前端开发 Java UED
JSF遇上Material Design:一场视觉革命,如何让传统Java Web应用焕发新生?
【8月更文挑战第31天】在当前的Web开发领域,用户体验和界面美观性至关重要。Google推出的Material Design凭借其独特的动画、鲜艳的颜色和简洁的布局广受好评。将其应用于JavaServer Faces(JSF)项目,能显著提升应用的现代感和用户交互体验。本文介绍如何通过PrimeFaces等组件库在JSF应用中实现Material Design风格,包括添加依赖、使用组件及响应式布局等步骤,为用户提供美观且功能丰富的界面。
53 0

推荐镜像

更多
下一篇
DataWorks