Qt中的双缓冲机制与应用方法是什么

免费教程   2024年05月10日 7:00  

本篇内容介绍了“Qt中的双缓冲机制与应用方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1、双缓冲机制

所谓双缓冲机制,是指在绘制控件时,首先将要绘制的内容绘制在一个图片中,再将图片一次性地绘制到控件上。

在早期的Qt版本中,若直接在控件上进行绘制工作,则在控件重绘时会产生闪烁的现象,控件重绘频繁时,闪烁尤为明显。双缓冲机制可以有效地消除这种闪烁现象。自 5 版本之后,QWidget 控件已经能够自动处理闪烁的问题。

因此,在控件上直接绘图时,不用再操心显示的闪烁问题,但双缓冲机制在很多场合仍然有其用武之地。当所需绘制的内容较复杂并需要频繁刷新,或者每次只需要刷新整个控件的一小部分时,仍应尽量采用双缓冲机制。

2、实例效果图

实现一个简单的绘图工具,可以选择线形,线宽,颜色等基本要素。效果图如下所示:

3、实例核心代码

PaintArea.h:

#ifndefPAINTAREA_H#definePAINTAREA_H#include<QWidget>#include<QPen>#include<QBrush>#include<QMouseEvent>#include<QPainter>//绘图区域classPaintArea:publicQWidget{Q_OBJECTpublic:enumShape{Dot,Line,Rectangle,RoundRect,Ellipse,Polygon,Polyline,Points,Arc,Path,Text,Pixmap};explicitPaintArea(QWidget*parent=nullptr);voidsetShape(Shapeshape);//设置形状voidsetPen(QPenpen);//设置画笔voidsetBrush(QBrushbrush);//设置画刷voidclear();//清除绘图区域protected:voidmousePressEvent(QMouseEvent*event);//鼠标点击事件voidmouseMoveEvent(QMouseEvent*event);//鼠标移动事件voidpaintEvent(QPaintEvent*event);//绘图事件private:Shapem_shape;//形状QPenm_pen;//画笔QBrushm_brush;//画刷QPixmap*m_pix;//画布QPointm_posStart;//鼠标移动绘图的开始坐标QPointm_posEnd;//鼠标移动绘图的结束坐标};#endif//PAINTAREA_H

PaintArea.cpp:

#include"PaintArea.h"PaintArea::PaintArea(QWidget*parent):QWidget(parent){//设置尺寸this->setMinimumSize(600,300);//用调色板设置背景色this->setPalette(QPalette(Qt::white));this->setAutoFillBackground(true);//初始化画布m_pix=newQPixmap(size());//此QPixmap对象用来准备随时接收绘制的内容m_pix->fill(Qt::white);//填充背景色为白色}//鼠标点击事件voidPaintArea::mousePressEvent(QMouseEvent*event){m_posStart=event->pos();}//鼠标移动事件voidPaintArea::mouseMoveEvent(QMouseEvent*event){QPainter*painter=newQPainter;//鼠标移动绘图在画布pix上painter->begin(m_pix);painter->setPen(m_pen);if(m_shape==Dot)painter->drawLine(m_posStart,event->pos());elseif(m_shape==Line)painter->drawLine(m_posStart,event->pos());painter->end();//形状为Dot时,也就是自由绘图模式时,才时刻更新开始点击坐标if(m_shape==Dot)m_posStart=event->pos();this->update();}//绘图事件voidPaintArea::paintEvent(QPaintEvent*){QPainterpainter(this);painter.drawPixmap(QPoint(0,0),*m_pix);}//设置形状voidPaintArea::setShape(Shapeshape){m_shape=shape;}//设置画笔voidPaintArea::setPen(QPenpen){m_pen=pen;}//设置画刷voidPaintArea::setBrush(QBrushbrush){m_brush=brush;}//清除绘图区域voidPaintArea::clear(){QPixmap*clearPix=newQPixmap(size());clearPix->fill(Qt::white);m_pix=clearPix;this->update();}4、双缓冲具体实现代码

下面是实现双缓冲区域的地方:

PaintArea::PaintArea(QWidget*parent):QWidget(parent){//设置尺寸this->setMinimumSize(600,300);//用调色板设置背景色this->setPalette(QPalette(Qt::white));this->setAutoFillBackground(true);//初始化画布m_pix=newQPixmap(size());//此QPixmap对象用来准备随时接收绘制的内容m_pix->fill(Qt::white);//填充背景色为白色}//鼠标移动事件voidPaintArea::mouseMoveEvent(QMouseEvent*event){QPainter*painter=newQPainter;//鼠标移动绘图在画布pix上painter->begin(m_pix);painter->setPen(m_pen);if(m_shape==Dot)painter->drawLine(m_posStart,event->pos());elseif(m_shape==Line)painter->drawLine(m_posStart,event->pos());painter->end();//形状为Dot时,也就是自由绘图模式时,才时刻更新开始点击坐标if(m_shape==Dot)m_posStart=event->pos();this->update();}//绘图事件voidPaintArea::paintEvent(QPaintEvent*){QPainterpainter(this);painter.drawPixmap(QPoint(0,0),*m_pix);}

我们不是直接在面板上画画,而且在 Pixmap 里面画画,在这里,我们调用drawPixmap()函数,将用于接收图形绘制的 QPixmap 对象绘制在绘制区窗体控件上,这样就实现了双缓冲机制。

“Qt中的双缓冲机制与应用方法是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

域名注册
购买VPS主机

您或许对下面这些文章有兴趣:                    本月吐槽辛苦排行榜

看贴要回贴有N种理由!看帖不回贴的后果你懂得的!


评论内容 (*必填):
(Ctrl + Enter提交)   

部落快速搜索栏

各类专题梳理

网站导航栏

X
返回顶部