opengl png图片 qt_QT中使用OpenGL绘图
在之前说道过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绘图相关推荐
- opengl png图片 qt_Qt学习:三维绘图之OpenGL和Qt的结合(转)
OpenGL是绘制三维图形的标准API.Qt应用程序可以使用QtOpenGL模块绘制三维图形,该模块依赖于系统的OpenGL库.Qt OpenGL模块提供QGLWidget类,可以通过对它子类化,并使 ...
- 【Qt OpenGL】Qt Creator中的3D绘图及动画教程
Qt Creator中的3D绘图及动画教程(参照NeHe) 刚刚学习了Qt Creator,发现Qt提供了QtOpenGL模块,对OpenGL做了不错的封装,这使得我们可以很轻松地在Qt程序中使用Op ...
- opengl png图片 qt_Qt翻页效果实现(四):OpenGL图像渲染
OpenGL贴图 OpenGL里面的图像渲染,是通过将图片映射成纹理,然后通过顶点坐标和对应的纹理坐标映射到物体表面. 顶点坐标 这里我们只有三个屏平面,在Qt翻页效果实现(二)文章中各点的坐标,在O ...
- opengl png图片 qt_Qt资源文件的格式,并用CMake添加Qt资源文件
目录 ......QRC文件的写法用CMake添加Qt资源文件添加QRC文件的函数步骤CPP中使用QRC文件使用QRC文件实例程序结果QRC文件CMakeLists.txt文件Dialog.h文件Di ...
- Qt中使用OpenGL进行绘图
Qt Creator中的3D绘图及动画教程(参照NeHe) 刚刚学习了Qt Creator,发现Qt提供了QtOpenGL模块,对OpenGL做了不错的封装,这使得我们可以很轻松地在Qt程序中使用Op ...
- 在Android中使用OpenGL ES开发第(五)节:GLSL基础语法
一.前期基础储备 笔者之前的四篇文综述了Android中使用OpenGL ES绘制基本图形和实现了简单的相机预览,初次接触OpenGL ES开发的读者可能对其中新的概念比较迷惑,尤其是其中的顶点着色器 ...
- 在Win32中使用OpenGL
在Win32下使用OpenGL http://blog.csdn.net/t_w_s/article/details/11021357 1.win32程序的框架是winMain+WndProc. ...
- 在Qt中使用OpenGL(四)
前言 在Qt中使用OpenGL(一) 在Qt中使用OpenGL(二) 在Qt中使用OpenGL(三) 在之前的文章中,我们通过一个最简单的例子完成了在Qt中使用OpenGL绘图的全过程,然后又使用了纹 ...
- Qt中的OpenGL
Qt还是本人可移植GUI程序开发的首选,不过Qt开发普通的应用程序是行,但是据说效率太低,以至于像某些人说的那种刷新看得到一条条横线?这点我比较纳闷,就我使用的感觉,虽然Qt不以效率著称,但是事实上有 ...
最新文章
- 细胞因子风暴与新冠肺炎
- jvm垃圾回收器(《深入理解java虚拟机》)
- hdu4126(MST + 树形dp
- cppcheck的安装和使用
- 企业门户网站服务器,企业或个人门户网站对服务器前的重要准备 - 酷番云
- 如何监控Android电视桌面,androidTV 电视桌面的效果
- jquey-jsonp-跨域请求数据
- 博客转移到cnblogs
- phpstorm ctrl 鼠标左键 无效_击败无聊的办公室重复操作,用 Python 控制鼠标和键盘...
- 运筹学学习笔记2 python-or tools 使用
- 计算机专业监理员工作,监理员是干什么的
- seo和sem的区别是什么?网站seo具体怎么做?
- PyGame实现小游戏案例[小甲鱼 PlayTheBall]
- 新世纪大学英语(第二版)综合教程第一册 Unit 3 重点单词
- 「实用工具—LICEcap」写博必备|动图制作|一键生成gif(GIF)
- 使用Unity的AR Foundation导出到安卓时出现黑屏问题的可能原因
- 什么是EC, EC与多副本的对比分析
- meshgrid()+plt.contourf()用法
- 单片机上电不断重启复位
- 论大学校园的“性开放”
热门文章
- JAVA中判断一个字符串是否包含另一个字符串
- mfc中点击关闭按钮时删除指定文件
- 人物和背景分离的快速方法
- Atitit 纯java项目的提升进度大法---通用json dsl接口
- priority_quenue
- DIP(依赖倒置原则),IoC(控制反转),DI(依赖注入)复习总结
- Mssql高级注入笔记.txt (转自:慕容小雨BLOG)
- 打造自己的专业图像工具-Visual C++ 2005图像编程系列【四】
- 一个导出类的内部函数的dll
- C++_类和对象_C++运算符重载_递增运算符重载_重载++运算符_前置++_后置++重载---C++语言工作笔记057