Qt|双缓存机制

327 阅读2分钟

「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」。

上一章节讲述了MFC框架下的双缓存机制,那么对于Qt框架,是不是也有同样的双缓存机制呢?当前,在Qt框架下也存在了双缓存机制,那么接下来就来讲述如何实现在Qt中应用双缓存机制吧!

在早期的Qt版本中,也存在了和MFC框架同样的问题,控件重绘时会产生闪烁现象,控件绘制频繁时,这种情况更为严重。不过,在Qt5版本之后,QWidget控件已经能够自动处理闪烁的问题了,虽然Qt框架中双缓存机制用的少了,但是在某些场合中仍然排上用场。

当我们需要绘制的图形比较复杂并且需要频繁刷新时,或者每次只刷新整个控件或者整个窗口的一小部分时,仍需要采用双缓存机制。

一般思路:在绘制控件的时候,首先将要绘制的内容绘制到一个图片上(QPixmap或者其他),再将图片一次性的绘制到控件上。

第一步:创建QPixmap对象接收绘制内容

setAutoFillBackground(true);
pix = new QPixmap(size());

第二步:双缓存机制

painter->begin(pix);

//中间处理数据

painter->end();

以QPixmap对象为QPaintDevice参数绘制。

在构造一个QPainter对象时,就立刻对绘图设备进行绘制,在这里QPainter对象是短期的,并且只能调用一次。

开始于begin()函数,并且在调用end()函数结束。

在绘制外部设备时,应该直接使用begin()end(),例如打印机设备等等。

QPainter painter;
painter->begin(this);
painter->drawLine(...);
painter->end();

类似于我们在程序中的这种写法:

QPainter painter(this);
p.drawLine(...);

猛然间一看,这两组代码就是一个多了begin、end方法一个没有,其实不然,在第一种情况中,QPainter对象并没有传入this指针,而第二种情况却存在。

为什么会有第一种情况的存在呢?

那是因为当一个QPainter对象的初始化失败时,构造函数不能提供反馈信息,也就无法绘制图形,所以这种情况也如上述所说,在绘制外部设备时经常用到begin(this)、end()这种方式了。

相比较MFC框架下的方法来说,真的是简单的不行了,只要记住begin之后写end方法就行。

我是中国好公民st,一名C++开发程序猿~