void MyPaint::paintEvent(QPaintEvent *event) { if(_openflag == 0)//不是打开图片的,每一次新建一个空白的画布 { _pixmap = QPixmap(size());//新建pixmap _pixmap.fill(Qt::white);//背景色填充为白色 } QPixmap pix = _pixmap;//以_pixmap作为画布 QPainter p(&pix);//将_pixmap作为画布 unsigned int i1=0,i2=0,i3=0,i4=0,k=0;//各种图形的索引 Q_UNUSED(event); QPen pen; pen.setColor(color); for(int c = 0;c<_shape.size();++c)//控制用户当前所绘图形总数 { if(_shape.at(c) == 1)//线条 { const QVector<QPoint>& line = _lines.at(i1++);//取出一条线条 for(int j=0; j<line.size()-1; ++j)//将线条的所有线段描绘出 { p.drawLine(line.at(j), line.at(j+1)); } } else if(_shape.at(c) == 2)//矩形 { p.drawRect(_rects.at(i2++)); } else if(_shape.at(c) == 3)//椭圆 { p.drawEllipse(_ellipse.at(i3++)); } else if(_shape.at(c) == 4)//直线 { p.drawLine(_line.at(i4).topLeft(),_line.at(i4).bottomRight()); i4++; } } p.end(); p.begin(this); // 将当前窗体作为画布 p.drawPixmap(0, 0, pix); // 绘制之前的 pixmap }使用双缓冲技术实现在绘制新的图形时只更新变化的部分而不重新绘制整个画布
时间: 2024-04-14 17:30:50 浏览: 88
mypaint:MyPaint是一个简单的绘图程序,可与Wacom风格的图形输入板一起使用
在这段代码中,双缓冲技术可以通过使用一个额外的 QPixmap 对象来实现。具体的实现方式如下:
1. 在类的成员变量中定义一个额外的 QPixmap 对象,命名为 bufferPixmap。
2. 在 paintEvent 函数的开头判断 _openflag 的值,如果为 0,则表示不是打开图片,需要新建一个空白的画布。在这种情况下,将 bufferPixmap 初始化为和当前窗体大小一致,并用白色填充。
3. 将 bufferPixmap 赋值给局部变量 pix,并使用 pix 作为绘图的画布。
4. 在绘制各种图形之前,创建一个 QPainter 对象,将其关联到 pix 上。
5. 根据 _shape 数组中的值来确定需要绘制的图形类型,并根据相应的索引取出对应的图形数据进行绘制。
6. 在所有图形都绘制完成后,调用 p.end() 结束对 pix 的绘制。
7. 调用 p.begin(this) 开始对当前窗体进行绘制。
8. 调用 p.drawPixmap(0, 0, pix) 绘制之前绘制在 bufferPixmap 上的内容。
通过使用双缓冲技术,只有在需要更新部分内容时才进行重新绘制,从而提高了绘图性能。
阅读全文