这里,我们用一个简单的opengl程序来了解一下QGLWidget类的结构。程序绘制了一个白色的正方形:
1. QGLWidget类的定义
[cpp] view plain copy
- class Widget : public QGLWidget
- {
- Q_OBJECT
- public:
- explicit Widget(QWidget *parent = 0);
- ~Widget();
- protected:
- //重写的三个虚函数
- void initializeGL();
- void resizeGL(int w, int h);
- void paintGL();
- private:
- Ui::Widget *ui;
- };
首先将类Widget的父类修改为QGLWidget。同时重写继承自QGLWidget的三个虚函数。
关于这三个虚函数,调用顺序及功能如下:
1. initializeGL() ,在程序开始执行的时候最先被调用一次(当然构造函数是最先执行的,其次是initializeGL() )。用来完成相关的初始化工作,比如建立opengl绘图的上下文环境。
2. resizeGL(),在initializeGL()完成之后被调用一次(实际为多次,原因不明??),以及在窗口位置以及大小改变时被调用。用于完成建立opengl视图窗口等一系列工作。
3. paintGL(),绘制opengl图像。当窗口需要被刷新时会被调用(即用户使用updateGL()函数的时候,屏幕会被重绘),以及在resizeGL()完成之后,也会引起重绘。
程序开始>>构造函数>>initializeGL()>>resizeGL()>>paintGL()
>>若用户调用updateGL()函数>>引起paintGL()函数的调用。
>>若窗口位置或者尺寸改变>>调用resizeGL()>>调用paintGL()
2. 构造函数
[cpp] view plain copy
- Widget::Widget(QWidget *parent) :
- QGLWidget(parent), //调用父类QGLWidget()
- ui(new Ui::Widget)
- {
- ui->setupUi(this);
- }
3. initiallizeGL()函数
[cpp] view plain copy
- void Widget::initializeGL()
- {
- //设置widget的坐标和尺寸
- setGeometry(300, 150, 500, 500);
- //设置清除时颜色
- glClearColor(0.0, 0.0, 0.0, 0);
- }
4. resizeGL()函数
[cpp] view plain copy
- void Widget::resizeGL(int w, int h)
- {
- //视口变换
- glViewport(0,0,(GLsizei)w,(GLsizei)h);
- //投影变换
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(40.0,(GLdouble)w/(GLdouble)h,0.1,10000.0);
- //视图变换
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt(0.0,0.0,10.0,0.0,0.0,0.0,0.0,1.0,0.0);
- }
5. paintGL()函数
[cpp] view plain copy
- void Widget::paintGL()
- {
- //清屏
- glClear(GL_COLOR_BUFFER_BIT);
- //绘制矩形
- glColor3f(1.0,1.0,1.0);
- glRectd(2.0,2.0,0.0,0.0);
- }
6. 执行结果
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:QGLWidget类_penghejuan2012的博客-优快云博客_qglwidget