在之前说道过VS2010中配合OpenGL绘图的问题,这回是想要说说在QT中使用OpenGL,其实两者并无太大区别,因为都是基于C++语言的。

主要是想简要介绍下OpenGL在QT中的使用方法跟一些错误。

glwidget.h  //继承自QGLWidget,用来实现OpenGL相关的操作以及绘图操作

#ifndef GLWIDGET_H

#define GLWIDGET_H

#include

#include

namespace Ui {

class GLWidget;

}

class GLWidget : public QGLWidget

{

Q_OBJECT

public:

explicit GLWidget(QGLWidget *parent = 0);

~GLWidget();

protected:

void initializeGL();  //初始化OpenGL窗口部件

void paintGL();  //绘制整个OpenGL窗口,只要有更新发生,这个函数就会被调用

void resizeGL(int width, int height); //处理窗口大小变化事件的,参数是新状态下的宽和高

void keyPressEvent(QKeyEvent *e);  //鼠标处理函数

protected:

bool fullscreen;  //判断是否全屏的变量

private:

Ui::GLWidget *ui;

};

#endif // GLWIDGET_H

glwidget.cpp  //glwidget.h的源文件

#include "glwidget.h"

#include "ui_glwidget.h"

#include

#include

#include

GLWidget::GLWidget(QGLWidget *parent) :

QGLWidget(parent),

ui(new Ui::GLWidget)

{

ui->setupUi(this);

fullscreen = false;

}

//这是对虚函数,这里是重写该函数

void GLWidget::initializeGL()

{

setGeometry(300, 200, 640, 480);//设置窗口初始位置和大小

glShadeModel(GL_FLAT);//设置阴影平滑模式

glClearColor(0.0, 0.0, 0.0, 0);//改变窗口的背景颜色

glClearDepth(1.0);//设置深度缓存

glEnable(GL_DEPTH_TEST);//允许深度测试

glDepthFunc(GL_LEQUAL);//设置深度测试类型

glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);//进行透视校正

}

void GLWidget::paintGL()

{

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glLoadIdentity();

//renderText(10,20,"Hello,My Dear");

// glColor3f(1.0, 0.0, 0.0);

/*

glBegin(GL_TRIANGLES);

glVertex3f(0.0, 1.0, 0.0);

glVertex3f(-1.0, -1.0, 0.0);

glVertex3f(1.0, -1.0, 0.0);

glEnd();

*/

glBegin(GL_TRIANGLES);

glColor3f(1.0f, 0.0f, 0.0f);

glVertex3f(0.0f, 1.0f, 0.0f);

glColor3f(0.0f, 1.0f, 0.0f);

glVertex3f(-1.0f, -1.0f, 0.0f);

glColor3f(0.0f, 0.0f, 1.0f);

glVertex3f(1.0f, -1.0f, 0.0f);

glEnd();

renderText(20, 100, "Hello Jcy, My first OpenGL app.");

}

//该程序是设置opengl场景透视图,程序中至少被执行一次(程序启动时).

void GLWidget::resizeGL(int width, int height)

{

if(0 == height)

height = 1;//防止一条边为0

glViewport(0, 0, (GLint)width, (GLint)height);//重置当前视口,本身不是重置窗口的,只不过是这里被Qt给封装好了

glMatrixMode(GL_PROJECTION);//选择投影矩阵

glLoadIdentity();//重置选择好的投影矩阵

// gluPerspective(45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0);//建立透视投影矩阵

//  glMatirxMode(GL_MODELVIEW);//以下2句和上面出现的解释一样

glLoadIdentity();

}

void GLWidget::keyPressEvent(QKeyEvent *e)

{

switch(e->key())

{

//F1键为全屏和普通屏显示切换键

case Qt::Key_F1:

fullscreen = !fullscreen;

if(fullscreen)

showFullScreen();

else

{

setGeometry(300, 150, 640, 480);

showNormal();

}

updateGL();

break;

//Ese为退出程序键

case Qt::Key_Escape:

close();

}

}

GLWidget::~GLWidget()

{

delete ui;

}

main.cpp //原始cpp文件,未改变

#include

#include "glwidget.h"

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

GLWidget w;

w.show();

return a.exec();

}

说明:

(1) 绘图工作:

voidGLWidget::paintGL()

这个是主要的绘图函数,整个的绘图工作都在这个里面。

(2) 坐标点:

OpenGL的坐标点的范围-1到1。

(3) 如何在OpenGL图形周围写字:

renderText(20,100,"HelloJcy,MyfirstOpenGLapp.");

第一个跟第二个参数是坐标位置,第三个是需要显示的字。

可能出现的错误:

(1)错误:C1083: Cannot open include file: 'QtOpenGL': No such file or directory

如果你是这个错误,那么你需要在.pro文件中添加QT += opengl

(2)错误:C2504: 'QGLWidget' : base class undefined

如果你是这个错误,那么请你在.h文件中添加 #include

(3)错误:C2039: 'show' : is not a member of 'GLWidget'

如果你是这个错误,那么请你在.h文件中添加#include

上面的代码参考了Qt_OpenGL教程

opengl png图片 qt_QT中使用OpenGL绘图相关推荐

  1. opengl png图片 qt_Qt学习:三维绘图之OpenGL和Qt的结合(转)

    OpenGL是绘制三维图形的标准API.Qt应用程序可以使用QtOpenGL模块绘制三维图形,该模块依赖于系统的OpenGL库.Qt OpenGL模块提供QGLWidget类,可以通过对它子类化,并使 ...

  2. 【Qt OpenGL】Qt Creator中的3D绘图及动画教程

    Qt Creator中的3D绘图及动画教程(参照NeHe) 刚刚学习了Qt Creator,发现Qt提供了QtOpenGL模块,对OpenGL做了不错的封装,这使得我们可以很轻松地在Qt程序中使用Op ...

  3. opengl png图片 qt_Qt翻页效果实现(四):OpenGL图像渲染

    OpenGL贴图 OpenGL里面的图像渲染,是通过将图片映射成纹理,然后通过顶点坐标和对应的纹理坐标映射到物体表面. 顶点坐标 这里我们只有三个屏平面,在Qt翻页效果实现(二)文章中各点的坐标,在O ...

  4. opengl png图片 qt_Qt资源文件的格式,并用CMake添加Qt资源文件

    目录 ......QRC文件的写法用CMake添加Qt资源文件添加QRC文件的函数步骤CPP中使用QRC文件使用QRC文件实例程序结果QRC文件CMakeLists.txt文件Dialog.h文件Di ...

  5. Qt中使用OpenGL进行绘图

    Qt Creator中的3D绘图及动画教程(参照NeHe) 刚刚学习了Qt Creator,发现Qt提供了QtOpenGL模块,对OpenGL做了不错的封装,这使得我们可以很轻松地在Qt程序中使用Op ...

  6. 在Android中使用OpenGL ES开发第(五)节:GLSL基础语法

    一.前期基础储备 笔者之前的四篇文综述了Android中使用OpenGL ES绘制基本图形和实现了简单的相机预览,初次接触OpenGL ES开发的读者可能对其中新的概念比较迷惑,尤其是其中的顶点着色器 ...

  7. 在Win32中使用OpenGL

    在Win32下使用OpenGL http://blog.csdn.net/t_w_s/article/details/11021357    1.win32程序的框架是winMain+WndProc. ...

  8. 在Qt中使用OpenGL(四)

    前言 在Qt中使用OpenGL(一) 在Qt中使用OpenGL(二) 在Qt中使用OpenGL(三) 在之前的文章中,我们通过一个最简单的例子完成了在Qt中使用OpenGL绘图的全过程,然后又使用了纹 ...

  9. Qt中的OpenGL

    Qt还是本人可移植GUI程序开发的首选,不过Qt开发普通的应用程序是行,但是据说效率太低,以至于像某些人说的那种刷新看得到一条条横线?这点我比较纳闷,就我使用的感觉,虽然Qt不以效率著称,但是事实上有 ...

最新文章

  1. 细胞因子风暴与新冠肺炎
  2. jvm垃圾回收器(《深入理解java虚拟机》)
  3. hdu4126(MST + 树形dp
  4. cppcheck的安装和使用
  5. 企业门户网站服务器,企业或个人门户网站对服务器前的重要准备 - 酷番云
  6. 如何监控Android电视桌面,androidTV 电视桌面的效果
  7. jquey-jsonp-跨域请求数据
  8. 博客转移到cnblogs
  9. phpstorm ctrl 鼠标左键 无效_击败无聊的办公室重复操作,用 Python 控制鼠标和键盘...
  10. 运筹学学习笔记2 python-or tools 使用
  11. 计算机专业监理员工作,监理员是干什么的
  12. seo和sem的区别是什么?网站seo具体怎么做?
  13. PyGame实现小游戏案例[小甲鱼 PlayTheBall]
  14. 新世纪大学英语(第二版)综合教程第一册 Unit 3 重点单词
  15. 「实用工具—LICEcap」写博必备|动图制作|一键生成gif(GIF)
  16. 使用Unity的AR Foundation导出到安卓时出现黑屏问题的可能原因
  17. 什么是EC, EC与多副本的对比分析
  18. meshgrid()+plt.contourf()用法
  19. 单片机上电不断重启复位
  20. 论大学校园的“性开放”

热门文章

  1. JAVA中判断一个字符串是否包含另一个字符串
  2. mfc中点击关闭按钮时删除指定文件
  3. 人物和背景分离的快速方法
  4. Atitit 纯java项目的提升进度大法---通用json dsl接口
  5. priority_quenue
  6. DIP(依赖倒置原则),IoC(控制反转),DI(依赖注入)复习总结
  7. Mssql高级注入笔记.txt (转自:慕容小雨BLOG)
  8. 打造自己的专业图像工具-Visual C++ 2005图像编程系列【四】
  9. 一个导出类的内部函数的dll
  10. C++_类和对象_C++运算符重载_递增运算符重载_重载++运算符_前置++_后置++重载---C++语言工作笔记057