QGLWidget类

来源:互联网 发布:mysql scope identity 编辑:程序博客网 时间:2024/06/10 08:02

这里,我们用一个简单的opengl程序来了解一下QGLWidget类的结构。程序绘制了一个白色的正方形:

1.  QGLWidget类的定义

class Widget : public QGLWidget{    Q_OBJECTpublic:    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.   构造函数

Widget::Widget(QWidget *parent) :    QGLWidget(parent),   //调用父类QGLWidget()    ui(new Ui::Widget){    ui->setupUi(this);}


3.  initiallizeGL()函数

void Widget::initializeGL(){    //设置widget的坐标和尺寸    setGeometry(300, 150, 500, 500);    //设置清除时颜色    glClearColor(0.0, 0.0, 0.0, 0);}

4. resizeGL()函数

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()函数

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.  执行结果

                



0 0