一、背景
在进行自定义控件时,往往void paintEvent(QPaintEvent *)
函数是必备的,如果在该函数中使用QPixmap导入位图过程中,将定时器超时时间设置较短(较快时间执行update操作),出现了软件页面绘图刷新性能下降。
二、问题描述
以下函数功能,主要是绘制一张背景图:
void xxxx::paintEvent(QPaintEvent *)
{
QPainter painter(this);
//此处加载一张QPixmap位图
QPixmap pixmap(":/assets/bg_image_blue.png");
painter.drawPixmap(this->rect(),pixmap);
}
由于paintEvent()函数是绘制Widget的重要函数,在该控件类中还创建了一个超时时间较短的QTimer,在超时处理函数中调用QWidget::update()页面更新函数进行页面更新。
由于时间较短,在paintEvent()事件处理函数中使用QPixmap pixmap(":/assets/bg_image_blue.png")
加载图片并绘制,由于过于频繁加载pixmap图片导致应用软件页面出现了卡顿现象。
三、解决方法
这里以“牺牲空间换取性能”为原则,将pixmap作为控件类的一个数据成员,在构造函数中使用bool QPixmap::load()
函数将待绘制的图片提前加载进内存(这里QPixmap将自动加入QPixmapCache缓存中),然后再进行绘制。
以此方法,减少了QPixmap的加载次数;将QPixmap放入QPixmapCache中也可提高软件的运行效率和性能。