资源描述:
《Qt双缓冲绘图》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、双缓冲绘图在Qt4中,所有的窗口部件默认都使用双缓冲进行绘图。使用双缓冲,可以减轻绘制的闪烁感。在有些情况下,用户要关闭双缓冲,自己管理绘图。下面的语句设置了窗口部件的Qt::WA_PaintOnScreen属性,就关闭了窗口部件的双缓冲.mywidget->setAttribute(Qt::WA_PaintOnScreen);由于Qt4不再提供异或笔,组合模式QPainter::CompostionMode_Xor()并不是异或笔,Qt4只提供了QRubberBand实现矩形和直线的绘图反馈。因此要实现在绘图中动态反馈必须使用其他方法。程序中使用双环冲来解决这个问题。在绘图过程中,
2、一个缓冲区绘制临时内存,一个缓冲区保存绘制好的内容,最后进行合并。在交互绘图过程中,程序将图像缓冲区复制到临时缓冲区,并在临时缓冲区上绘制,绘制完毕在将结果复制到图像缓冲区,如果没有交互复制,则直接将图像缓冲区绘制显示到屏幕上。Qt组件中的双缓冲无闪烁绘图闪烁首先,要想把闪烁减弱,请设置组件的背景模式为NoBackground.setBackgroundMode(NoBackground);其次,重载组件的paintEvent()函数,如下改写:voidMyWidget::paintEvent(QPaintEvent*e){QRectur=e->rect();//得到组件尺寸QPix
3、mappix(ur.size());//以此为参数创建一个位图变量pix.fill(this,ur.topLeft());//填充位图QPainterp(&pic);//以位图为参数创建一个QPainter对象p.translate(-ur.x(),-ur.y());//在QPainter上绘画//......//Drawingp.End();//绘画完毕bitBlt(this,ur.topLeft().&pix);//把位图贴到组件上//注从qt4开始,bitBlt函数不在使用,取而代之的是drawPixmap。}//这是能随机绘点的关键,没有设置此属性,默认相当于每次Qt都会完整
4、的将上一次的屏幕擦除,//新版的Qt中已经没有了repaint(bool)接口了。w.setAttribute(Qt::WA_OpaquePaintEvent);老电视机雪花效果中每次都需要擦除重绘避免点的叠加所以一下语句注释掉//w.setAttribute(Qt::WA_OpaquePaintEvent);(以下是私有函数的实现:voidPlotter::updateRubberBandRegion(){QRectrect=rubberBandRect.normalized();update(rect.left(),rect.top(),rect.width(),1);updat
5、e(rect.left(),rect.top(),1,rect.height());update(rect.left(),rect.bottom(),rect.width(),1);update(rect.right(),rect.top(),1,rect.height());}函数updateRubberBand()在mousePressEvent(),mouseMoveEvent()和mouseReleaseEvent()中被调用,用来删除或者重新绘制橡皮线。函数中调用了四次update(),用四个绘制事件完成由橡皮线(两条垂直和水平的线)组成的四个小矩形的绘制。Qt也提供了一个
6、类QRubberBand用来绘制橡皮线,但是控件自己提供的绘制函数会更好voidPlotter::refreshPixmap(){pixmap=QPixmap(size());pixmap.fill(this,0,0);QPainterpainter(&pixmap);painter.initFrom(this);drawGrid(&painter);drawCurves(&painter);update();}函数refreshPixmap()把plot绘制到图片上,并且更新显示。首先我们把图片的大小调整为和当前控件大小相同,然后用控件的背景颜色填充整个图片。这个颜色是当前调色版的
7、“dark”部分,因为在Plotter构造函数中调用setBackgroundRole()。如果背景用的刷子是非实心的(solidbrush,刷子的样式,只有颜色,没有花纹的那种最简单的),QPixmap::fill()需要知道控件中刷子的偏移量,以便图片对齐刷子模式。这里图片对应整个控件,因此偏移位置为(0,0)。接下来我们创建了一个QPainter对象来绘制图片,QPainter::initFrom()设置绘制图片所需画笔,背景和字体,参数this表示