最近在做一个利用Qt开发的小程序,其中一项功能是读取三维点云数据格式(如PLY、OBJ)数据,并利用OpenGL显示在程序窗口中。由于博主对OpenGL不太了解,只好参考相关的范例一步一步地进行开发。本文就是针对最基础的在Qt中使用OpenGL的相关知识进行一番梳理。
编程环境是Qt 5.3.2(MSVC 2010,32bit)with opengl。
以下代码部分参考了C++ GUI Qt 4编程(第二版)中第20章的范例,BTW,个人认为这本书对初学Qt的童鞋很有帮助。
首先是项目的建立,这里新建了一个Qt Widget Application,名叫Widget。并从QWidget基类继承,没有创建.ui文件。
创建了空的项目后,根据书中的实例添加了代码。另外在.pro文件中QT += opengl。
widget.h文件如下所示:
#ifndef WIDGET_H
#define WIDGET_H
#include <QGLWidget>
class Widget : public QGLWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
protected:
void initializeGL();
void resizeGL(int width, int height);
void paintGL();
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseDoubleClickEvent(QMouseEvent *event);
private:
void draw();
int faceAtPosition(const QPoint &pos);
GLfloat rotationX;
GLfloat rotationY;
GLfloat rotationZ;
QColor faceColors[4];
QPoint lastPos;
};
#endif // WIDGET_H
widget.cpp如下:
#include "widget.h"
#include <QMouseEvent>
#include <QColorDialog>
#include <GLU.h>
Widget::Widget(QWidget *parent)
: QGLWidget(parent)
{
setFormat(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer));
rotationX = -21.0;
rotationY = -57.0;
rotationZ = -0.0;
faceColors[0] = Qt::red;
faceColors[1] = Qt::green;
faceColors[2] = Qt::blue;
faceColors[3] = Qt::yellow;
}
Widget::~Widget()
{
}
void Widget::initializeGL()
{
qglClearColor(Qt::black);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
}
void Widget::resizeGL(int width, int height)
{
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLfloat x = GLfloat(width) / height;
glFrustum(-x,+x,-1.0,+1.0,4.0,15.0);
glMatrixMode(GL_MODELVIEW);
}