双缓冲机制:在绘制控件时,首先将要绘制的内容绘制到一个图片中(QPixmap或其他),再将图片一次性的绘制到控件上。

双缓冲机制可以解决早期Qt控件重绘频繁闪烁的问题,Qt5以后解决了,Qt控件自动处理闪烁问题。但是双缓冲机制再许多场合仍然有用武之地。当需要绘制的内容比较复杂且需要频繁刷新时,或者每次只需要刷新整个控件的一小部分时,仍应该尽量采用双缓冲机制。

 1 class MyWidget: public QWidget
 2 {
 3   ......
 4   QPixmap* pix;
 5 }
 6 
 7 MyWidget::MyWidget
 8     :QWidget(parent)
 9 {
10   ,...
11   pix = new QPixmap(this->size());
12   pix->fill(Qt::white):
13   ....
14 }
15 
16 void MyWidget::mouseMoveEvent(QMoveEvent* e)
17 {
18    ...
19   painter->begin(pix); //开始在pixmap上绘制
20   painter->setPen(pen);
21   painter->drawLine(startPos, e->pos()); //根据鼠标移动画线
22   painter->end(); //结束绘制
23   starPos = e->pos(); 
24   update(); //刷新界面
25 } 
26 
27 void MyWidget::paintEvent(QPaintEvent* e)
28 {
29    QPainter p(this);
30    p.drawPixmap(QPoint(0,0), *pix); //绘制pixmap
31 }