QGLWidget类的初始化顺序

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

1.  QGLWidget类的定义

[cpp] view plain copy

  1. class Widget : public QGLWidget  
  2. {  
  3.     Q_OBJECT  
  4.   
  5. public:  
  6.     explicit Widget(QWidget *parent = 0);  
  7.     ~Widget();  
  8.   
  9. protected:  
  10.     //重写的三个虚函数  
  11.     void initializeGL();  
  12.     void resizeGL(int w, int h);  
  13.     void paintGL();  
  14.       
  15. private:  
  16.     Ui::Widget *ui;  
  17. };  

首先将类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

  1. Widget::Widget(QWidget *parent) :  
  2.     QGLWidget(parent),   //调用父类QGLWidget()  
  3.     ui(new Ui::Widget)  
  4. {  
  5.     ui->setupUi(this);  
  6. }  


 

3.  initiallizeGL()函数

[cpp] view plain copy

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

4. resizeGL()函数

[cpp] view plain copy

  1. void Widget::resizeGL(int w, int h)  
  2. {  
  3.     //视口变换  
  4.     glViewport(0,0,(GLsizei)w,(GLsizei)h);  
  5.     //投影变换  
  6.     glMatrixMode(GL_PROJECTION);  
  7.     glLoadIdentity();  
  8.     gluPerspective(40.0,(GLdouble)w/(GLdouble)h,0.1,10000.0);  
  9.     //视图变换  
  10.     glMatrixMode(GL_MODELVIEW);  
  11.     glLoadIdentity();  
  12.     gluLookAt(0.0,0.0,10.0,0.0,0.0,0.0,0.0,1.0,0.0);  
  13. }  

5. paintGL()函数

[cpp] view plain copy

  1. void Widget::paintGL()  
  2. {  
  3.     //清屏  
  4.     glClear(GL_COLOR_BUFFER_BIT);  
  5.     //绘制矩形  
  6.     glColor3f(1.0,1.0,1.0);  
  7.     glRectd(2.0,2.0,0.0,0.0);  
  8. }  

6.  执行结果

                

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:QGLWidget类_penghejuan2012的博客-CSDN博客_qglwidget

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值