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相关推荐

  1. NeHe教程Qt实现——lesson10

    NeHe 系列教程之十:在3D空间中漫游 英文教程地址:lesson10 本课演示了从外部文件中加载数据构建3D模型的实例,代码基于第一课. 首先是3D模型的数据结构定义: namespace {bo ...

  2. NeHe教程Qt实现——lesson07

    NeHe 系列教程之七: 光照及纹理过滤 英文教程地址:lesson07 本课将以第一课的代码为基础, 实现光照效果. 首先是对象定义与纹理加载的代码: namespace { bool light; ...

  3. NeHe教程Qt实现——lesson08

    NeHe 系列教程之八: 混合 英文教程地址:lesson08 本课将在第七课的基础上添加颜色混合的代码: namespace { ... bool blend; // Blending OFF/ON ...

  4. NeHe教程Qt实现——lesson09

    NeHe 系列教程之九: 在3D空间中移动位图 英文教程地址:lesson09 本课基于第一课的代码, 利用颜色混合的方法,将一个黑白纹理与随机颜色进行混合,产生绚丽的效果. 首先是定义相关变量和数据 ...

  5. NeHe教程Qt实现——lesson16

    NeHe 系列教程之十四:雾 英文教程地址:lesson16 本课展示产生雾. 相关变量和函数定义: namespace { bool gp; GLuint fogMode[] = { GL_EXP, ...

  6. NeHe教程Qt实现——lesson06

    NeHe 系列教程之六: 纹理映射 英文教程地址:lesson06 本课以第一课的代码为基础,演示了加载纹理的过程. 首先给出的是绘制几何对象和加载纹理坐标的代码 namespace {GLfloat ...

  7. NeHe教程Qt实现——lesson15

    NeHe 系列教程之十四:纹理 轮廓字体 英文教程地址:lesson15 本课展示如何创建和显示纹理轮廓字体, 代码基于第一课. 首先是字体库的创建: namespace {#define USE_D ...

  8. NeHe教程Qt实现——lesson13

    NeHe 系列教程之十三: 位图字体 英文教程地址:lesson13 本课将展示位图字体的创建和显示, 代码基于第一课. 首先是字休库的创建,如下所示: namespace {#define USE_ ...

  9. NeHe教程Qt实现——lesson14

    NeHe 系列教程之十四: 轮廓字体 英文教程地址:lesson14 本课展示如何创建和显示轮廓字体,即带有尝试的字体,可沿Z轴旋转和移动, 代码基于第一课. 同前一课类似,首先也是要创建字体库以及对 ...

最新文章

  1. Dedecms5.7搜索结果页空白无内容的解决方法
  2. python发明者叫什么-python是怎么被发明的
  3. “谈谈我对技术发展的一点感悟”阅读小记
  4. 修改VMOS2的SID 并成为成员服务器,求助SAS9.4服务器版的sid!!!急急!
  5. Java 异常(Java Exception)(一)
  6. mysql实体数据模型闪_visualstudio2017 +EF+Mysql生成实体数据模型闪退
  7. php 正则第一个,为什么这个正则表达式与php中的第一个结果不匹配?
  8. java 通过JLayeredPane实现背景图上添加其他控件
  9. iir matlab 系数,手把手教你用matlab生成STM32官方IIR滤波器的系数
  10. 在linux大量进程里只看root的命令
  11. Java和C#的区别
  12. javascript异步代码的回调地狱以及JQuery.deferred提供的promise解决方式
  13. linux一键ghost,linux 下一键 Ghost
  14. android表格布局的属性,android:TableLayout表格布局详解
  15. win10开启cpu虚拟化
  16. 单龙芯3A3000-7A1000PMON研究学习-(2)搭建交叉编译环境
  17. W ndows7系统的桌面不见了,windows7桌面音量控制键不见了怎么办(图文)
  18. 职场六大困惑,处理不好每一个都很扎心
  19. PYTHON 编写程序实现以下功能:计算beg到end之间的所有水仙花数并输出。如果beg到end之间不存在水仙花数,则输出“not found”。
  20. python学习 之 笔记一

热门文章

  1. Myeclipse8.5配置本地tomcat
  2. UIViewController生命周期
  3. Centos升级php mysql
  4. android多线程断点续传
  5. D-Link防火墙操作初步
  6. JavaScript学习与实践(8)
  7. Linux 内核Coding Style整理
  8. 线程属性--十分重要的概念
  9. 前端学HTTP之网关、隧道和中继
  10. SQL Relay 0.47 发布,SQL 中间层