双缓冲绘图

// 通过这种双缓冲机制,所有的绘制工作都先在后台缓存中完成,然后一次性将结果显示到窗口上,
// 从而避免了绘制时的屏幕闪烁。
class DoubleBufferedWidget : public QWidget {
    Q_OBJECT

public:
    DoubleBufferedWidget(QWidget *parent = nullptr);

protected:
    void paintEvent(QPaintEvent *event) override {
        // 如果 m_pixmap 是空的,直接返回,不进行绘制
        if (m_pixmap.isNull()) {
            return;
        }

        QPainter painter(this);  // 创建一个 QPainter 对象,用于在窗口上绘制
        painter.setRenderHint(QPainter::Antialiasing, true);  // 开启抗锯齿,提高绘制质量

        QRect rect = geometry();  // 获取窗口的几何区域(即大小)
        int w = rect.width();     // 获取窗口的宽度
        int h = rect.height();    // 获取窗口的高度

        // 将 pixmap 调整为和窗口大小一致,保持宽高比
        m_pixmap = m_pixmap.scaled(w, h, Qt::KeepAspectRatio);

        // 创建一个后台缓存,大小与绘制区域一致
        QPixmap buffer(m_pixmap.size());  // 这个是后台缓存
        QPainter p(&buffer);  // 创建一个 QPainter 对象来在缓存上绘制

        // 使用源模式将 m_pixmap 绘制到后台缓存中
        p.setCompositionMode(QPainter::CompositionMode_Source);
        p.drawPixmap(0, 0, m_pixmap);  // 将前景图像(m_pixmap)绘制到后台缓存

        // 使用目标模式对缓存进行裁剪处理(例如应用透明度等效果)
        p.setCompositionMode(QPainter::CompositionMode_DestinationIn);
        p.end();  // 结束绘制缓存

        // 最后,将已经处理过的后台缓存绘制到前台
        painter.drawPixmap(0, 0, buffer);  // 将后台缓存绘制到窗口上(前台)
    }

private:
    QPixmap m_pixmap;  // 用来存储前台图像的 QPixmap
};
DoubleBufferedWidget::DoubleBufferedWidget(QWidget *parent) : QWidget(parent)
{
    // 设置窗口大小
    setFixedSize(parent->size());
    m_pixmap.load("C:/Users/86189/Pictures/xbcl.jpg");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值