Qt学习笔记(四) 双缓冲

原创 2011年01月14日 14:28:00

双缓冲主要用于图形用户界面的开发,包括把一个窗口部件渲染到一个像素图,和把这个像素图绘制到屏幕上。

和自定义窗口部件一样,需要从 QWidget 继承一个类,然后至少要重写 paintEvent() 函数,还需要一个 QPixmap 作为窗口部件渲染的像素图。

 

class Widget : public QWidget

{

    Q_OBJECT

 

public :

    Widget( QWidget * parent = 0 );

    ~ Widget();

 

protected :

    void paintEvent( QPaintEvent * event);

 

private :

    QColor changeColor();

 

private Q_SLOTS :

    void refresh();

 

private :

    QPixmap * pixmap;

     QTimer   * timer;

    int      r;

    int      g;

    int      b;

};

 

Widget 类重写了 QWidget paintEvent() 函数,使用了 QTimer 定时刷新屏幕,声明了 refresh 槽来接受 QTimer 的信号。

 

 

Widget:: Widget( QWidget * parent)

    : QWidget ( parent), r( 0 ), g( 0 ), b( 0 )

{

    pixmap = new QPixmap ( size());

    pixmap-> fill( this , 0 , 0 );

    timer = new QTimer ( this );

    connect( timer, SIGNAL ( timeout()), this , SLOT ( refresh()));

    timer-> start( 10 );

}

 

Widget::~ Widget()

{

    if ( pixmap != 0 )

        delete pixmap;

 

    if ( timer-> isActive())

        timer-> stop();

    delete timer;

}

 

在构造函数里创建了渲染的目标像素图和计时器,并将计时器的 timeout 信号和窗口的 refresh 槽相连接,然后启动计时器,时间间隔为 10ms 。在析构函数里销毁像素图和计时器。

 

 

void Widget:: refresh()

{

    if ( pixmap != 0 ){

        delete pixmap;

    }

    pixmap = new QPixmap ( size());

    pixmap-> fill( this , 0 , 0 );

    QPainter painter( pixmap);

    painter. fillRect( rect(), changeColor());

    update();

}

 

refresh() 里面,先清空像素图里面的内容,将大小调整为窗口部件的大小,然后用默认的颜色来填充像素图。然后用 QPainter 在像素图上绘制。最后用 update() 来为整个窗口部件预约一个重绘事件,这个事件将激活 paintEvent()

 

void Widget:: paintEvent( QPaintEvent * /*event*/ )

{

    QPainter painter( this );

    painter. drawPixmap( 0 , 0 , * pixmap);

}

 

绘制事件很简单,直接将像素图绘制在屏幕上即可。

 

QColor Widget:: changeColor()

{

    r = r< 255 ? ++ r : r;

    g = g< 255 ? ++ g : g;

    b = b< 255 ? ++ b : b;

    return QColor ( r, g, b);

}

 

这个例子是用不同的颜色填充窗口部件,所以还有一个控制颜色变化的函数。这个和整个双缓冲机制无关。

相关文章推荐

qt 双缓冲绘图

refer to http://www.yafeilinux.com/?p=73 private slots: void mousePressEvent(QMouseEvent *even...

QT_双缓冲技术1

Rubber band(橡皮筋线,或者橡皮线), pixmap(图像,双缓冲中用到的图像,有时也直呼pixmap),off-screen pixmap(离线图像) Plot(plot,这一节实现的就...

Qt双缓冲机制:实现一个简单的绘图工具(纯代码实现)

知识准备: 双缓冲机制: 在绘制控件时,首先将要绘制的内容绘制在一张图片中,再将图片一次性绘制到控件上。...

Qt的双缓冲技术(double buffering)

Qt的双缓冲技术(double buffering)是Qt绘画机制的一部分,是一种在Qt4中被全面采用的技术。其核心是:把一个窗口部件渲染到一个脱屏pixmap(off- screen pixma...

qt之双缓冲绘图

转载自:https://wizardforcel.gitbooks.io/qt-beginning/content/22.html 导语 在前面一节中,讲述了如何实现简单的涂鸦板,这一次我们将...

QtPropertyBrowser的安装与配置

QtPropertyBrowser的安装与配置 简介: QtPropertyBrowser提供了简便地用于编辑Properties的方法。下载: http://qt.nokia.com/product...

opengl学习笔记(双缓冲与融合技术)

今天看了看opengl的融合技术,联系前一段时间老师让我改的一个用他自己的框架实现的3d物体透明融合的程序,感觉到老师说的思路,不可以实现。 因为三维的透明物体,简单的使用融合功能和融合因子是不够的...

逐梦旅程学习笔记 Windows/GDI 示例02:双缓冲贴图/绘制自由线条

继续GDi绘图,这个示例主要包括两个方面: 1、双缓冲绘图 2、

对Qt中双缓冲绘图的理解

对Qt中双缓冲绘图的理解 原教程 :http://bbs.qter.org/forum.php?mod=viewthread&tid=120&extra=page%3D1%26filter%3D...

Qt双缓冲绘图简例

双缓冲绘图 如果想在涂鸦板上绘制矩形,并且可以动态地绘制这个矩形,也就是说可以用鼠标画出随意大小的矩形,那该怎么办呢? 我们先进行下面的三步,最后引出所谓的双缓...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Qt学习笔记(四) 双缓冲
举报原因:
原因补充:

(最多只允许输入30个字)