QT中双缓冲加速绘制

16 篇文章 2 订阅

QT中的绘制都是在函数paintEvent(QPaintEvent *event)中绘制的,而且必须在这个函数下面绘制。
绘制简单的图形的时候效率还是不错的,但是一旦绘制的内容比较多的时候,绘制的时候就是有些卡顿了。
有的同学就是说,可以使用线程的方式,多开一个线程就可以了,但是大家不要忘了,任何绘制的过程都是在paintEvent(QPaintEvent *event)
这个函数中实现的,即使开启另外一个线程,处理数据是可以的,但是绘制的时候还是在这个函数中,相当于永远都是单线程的绘制。

那么有没有办法加快绘制的过程呢?答案是有的,就是采用双缓冲的技术。

何谓“双缓冲”?顾名思义,就是缓冲两次,第一次是用来绘制图形,一次是用来显示图形,区别于之前的边绘制边显示的模式。
首先在内存中把需要绘制好的东西绘制到内存buffer中,然后在把绘制的内存一次性的显示出来;如果这样觉得还不够快的话,可以单独开起一个绘制的线程。

drawPixmap是利用GPU绘制的,可以节约CPU的资源

代码:
定义一个绘制的图片:

QPixmap* trackPixmap = nullptr;//航迹绘制图片
QRect rect;//pixmap的矩形范围
PlayDataThread* dataThread2 = nullptr;//航迹绘制线程

初始化当前这个图片:

trackPixmap = new QPixmap(size);
trackPixmap->fill(Qt::transparent);//设置背景透明
rect = trackPixmap->rect();

在线程中绘制:

void run(){
    QPainter p(trackPixmap);
        double x = 0.0, y = 0.0;
        ThePosition* position = nullptr;
        std::vector<ThePosition*> ptList = trackDisplay->getTrackPath()->getTrackPoints();
        for (int i = startPos; i < endPos; i++) {
            bool b = rect.contains(x, y);
            if (b)  {//矩形之外的点不在绘制
                p.drawRect(x, y, 1, 1);
            }
        }
}

绘制图片:
在函数paintEvent(QPaintEvent *event)中绘制图片

painter->drawPixmap(0, 0, *trackPixmap);

只要在线程中绘制图片,在这个过程中不会出现卡顿的情况。以上!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值