您的位置:首页 > 编程语言 > Qt开发

QT与OpenGL之绘图

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

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

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

#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <QtOpenGL>
#include <QWidget>

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 <QtGui>
#include <QtCore>
#include <QtOpenGL>

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 <QtGui/QApplication>
#include "glwidget.h"

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
GLWidget w;
w.show();

return a.exec();
}




说明:

(1) 绘图工作:
void GLWidget::paintGL()

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

(2) 坐标点:

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

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

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

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

可能出现的错误:

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

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

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

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

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

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

上面的代码参考了Qt_OpenGL教程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: