NeHe教程Qt实现——lesson01
NeHe 系列教程之一: 创建一个OpenGL 窗口
英文教程地址: lesson01
在Qt的实现中, 我们主要依赖QGLWidget类, 我们主要重载三个重要方法 :
void initializeGL();
void resizeGL(int w, int h);
void paintGL();
下面给出实现代码,本课代码框架也是后续课程代码的基础,一些通用代码仅在此课中展示。
首先,声明创建OpenGL窗口类,它继承于QGLWidget, 代码如下:
#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H#include <QGLWidget>class QTimer;
class QKeyEvent;class MyGLWidget : public QGLWidget
{Q_OBJECT
public:explicit MyGLWidget(QWidget *parent = 0);protected:void initializeGL();void resizeGL(int w, int h);void paintGL();void keyPressEvent(QKeyEvent *);void closeEvent(QCloseEvent *);private:QTimer *timer;bool fullscreen; //窗口是否全屏显示
};#endif // MYGLWIDGET_H
该类主要声明了三个重载方法,并重载了按键和关闭窗口事件响应方法。
窗口类的实现代码如下:
#include "myglwidget.h"
#include <QTimer>
#include <QKeyEvent>
#include <QMessageBox>
#include <QApplication>
#include <QDebug>MyGLWidget::MyGLWidget(QWidget *parent) :QGLWidget(parent), fullscreen(false)
{setWindowTitle(tr("nehe----lesson01"));timer = new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(updateGL())); //不停刷新窗口timer->start(10);
}void MyGLWidget::initializeGL()
{glShadeModel(GL_SMOOTH); // Enables Smooth ShadingglClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Black BackgroundglClearDepth(1.0f); // Depth Buffer SetupglEnable(GL_DEPTH_TEST); // Enables Depth TestingglDepthFunc(GL_LEQUAL); // The Type Of Depth Test To DoglHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
}void MyGLWidget::resizeGL(int width, int height)
{if (height==0) { // Prevent A Divide By Zero Byheight=1; // Making Height Equal One}glViewport(0, 0, width, height); // Reset The Current ViewportglMatrixMode(GL_PROJECTION); // Select The Projection MatrixglLoadIdentity(); // Reset The Projection Matrix// Calculate The Aspect Ratio Of The WindowgluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);glMatrixMode(GL_MODELVIEW); // Select The Modelview MatrixglLoadIdentity(); // Reset The Modelview Matrix
}void MyGLWidget::paintGL()
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth BufferglLoadIdentity(); // Reset The Current Modelview MatrixqDebug("NeHe--Lesson1");
}void MyGLWidget::keyPressEvent(QKeyEvent *e)
{switch (e->key()) {case Qt::Key_F: //F 键进行全屏切换fullscreen = !fullscreen;if (fullscreen) {showFullScreen();} else {resize(640, 480);showNormal();}break;case Qt::Key_Escape: //退出确认QMessageBox::StandardButton reply;reply = QMessageBox::question(NULL, "NeHe","Do you want to exit?",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes);if (reply == QMessageBox::Yes) {qApp->quit();}break;default:QGLWidget::keyPressEvent(e);break;}
}
//点击窗口关闭按键时确认退出
void MyGLWidget::closeEvent(QCloseEvent *e)
{QMessageBox::StandardButton reply;reply = QMessageBox::question(this, "NeHe","Do you want to exit?",QMessageBox::Yes | QMessageBox::No,QMessageBox::No);if (reply == QMessageBox::Yes) {e->accept();} else {e->ignore();}
}
main函数中的代码如下所示:
#include <QApplication>
#include "myglwidget.h"int main(int argc, char *argv[])
{QApplication app(argc, argv);MyGLWidget win;win.show();return app.exec();
}
运行效果如下所示:
转载于:https://my.oschina.net/fuyajun1983cn/blog/263773
NeHe教程Qt实现——lesson01相关推荐
- NeHe教程Qt实现——lesson10
NeHe 系列教程之十:在3D空间中漫游 英文教程地址:lesson10 本课演示了从外部文件中加载数据构建3D模型的实例,代码基于第一课. 首先是3D模型的数据结构定义: namespace {bo ...
- NeHe教程Qt实现——lesson07
NeHe 系列教程之七: 光照及纹理过滤 英文教程地址:lesson07 本课将以第一课的代码为基础, 实现光照效果. 首先是对象定义与纹理加载的代码: namespace { bool light; ...
- NeHe教程Qt实现——lesson08
NeHe 系列教程之八: 混合 英文教程地址:lesson08 本课将在第七课的基础上添加颜色混合的代码: namespace { ... bool blend; // Blending OFF/ON ...
- NeHe教程Qt实现——lesson09
NeHe 系列教程之九: 在3D空间中移动位图 英文教程地址:lesson09 本课基于第一课的代码, 利用颜色混合的方法,将一个黑白纹理与随机颜色进行混合,产生绚丽的效果. 首先是定义相关变量和数据 ...
- NeHe教程Qt实现——lesson16
NeHe 系列教程之十四:雾 英文教程地址:lesson16 本课展示产生雾. 相关变量和函数定义: namespace { bool gp; GLuint fogMode[] = { GL_EXP, ...
- NeHe教程Qt实现——lesson06
NeHe 系列教程之六: 纹理映射 英文教程地址:lesson06 本课以第一课的代码为基础,演示了加载纹理的过程. 首先给出的是绘制几何对象和加载纹理坐标的代码 namespace {GLfloat ...
- NeHe教程Qt实现——lesson15
NeHe 系列教程之十四:纹理 轮廓字体 英文教程地址:lesson15 本课展示如何创建和显示纹理轮廓字体, 代码基于第一课. 首先是字体库的创建: namespace {#define USE_D ...
- NeHe教程Qt实现——lesson13
NeHe 系列教程之十三: 位图字体 英文教程地址:lesson13 本课将展示位图字体的创建和显示, 代码基于第一课. 首先是字休库的创建,如下所示: namespace {#define USE_ ...
- NeHe教程Qt实现——lesson14
NeHe 系列教程之十四: 轮廓字体 英文教程地址:lesson14 本课展示如何创建和显示轮廓字体,即带有尝试的字体,可沿Z轴旋转和移动, 代码基于第一课. 同前一课类似,首先也是要创建字体库以及对 ...
最新文章
- Dedecms5.7搜索结果页空白无内容的解决方法
- python发明者叫什么-python是怎么被发明的
- “谈谈我对技术发展的一点感悟”阅读小记
- 修改VMOS2的SID 并成为成员服务器,求助SAS9.4服务器版的sid!!!急急!
- Java 异常(Java Exception)(一)
- mysql实体数据模型闪_visualstudio2017 +EF+Mysql生成实体数据模型闪退
- php 正则第一个,为什么这个正则表达式与php中的第一个结果不匹配?
- java 通过JLayeredPane实现背景图上添加其他控件
- iir matlab 系数,手把手教你用matlab生成STM32官方IIR滤波器的系数
- 在linux大量进程里只看root的命令
- Java和C#的区别
- javascript异步代码的回调地狱以及JQuery.deferred提供的promise解决方式
- linux一键ghost,linux 下一键 Ghost
- android表格布局的属性,android:TableLayout表格布局详解
- win10开启cpu虚拟化
- 单龙芯3A3000-7A1000PMON研究学习-(2)搭建交叉编译环境
- W ndows7系统的桌面不见了,windows7桌面音量控制键不见了怎么办(图文)
- 职场六大困惑,处理不好每一个都很扎心
- PYTHON 编写程序实现以下功能:计算beg到end之间的所有水仙花数并输出。如果beg到end之间不存在水仙花数,则输出“not found”。
- python学习 之 笔记一