You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用QPropertyAnimation动画调整自定义QGraphicsPixmapItem的尺寸?

实现QGraphicsPixmapItem的尺寸动画方案

嘿,这个问题我之前做Qt动画的时候也碰到过——QGraphicsPixmapItem确实没有直接暴露size属性给QPropertyAnimation用,但有几个实用的办法能实现你要的尺寸动画效果,我给你详细说说:

方法一:利用内置的scale属性做缩放动画

QGraphicsItem本身自带scale(或者分xScale、yScale)属性,完全可以直接用QPropertyAnimation绑定这个属性来实现尺寸变化的效果,这是最简单的方案。

如果需要基于图像中心缩放,记得先设置变换原点:

// 假设你已经创建了Pixmap实例item
item->setTransformOriginPoint(item->boundingRect().center());

// 创建缩放动画
QPropertyAnimation* scaleAnim = new QPropertyAnimation(item, "scale");
scaleAnim->setDuration(1000); // 动画时长1秒
scaleAnim->setStartValue(1.0); // 初始缩放比例(原尺寸)
scaleAnim->setEndValue(1.5);   // 放大到1.5倍
scaleAnim->start(QAbstractAnimation::DeleteWhenStopped);

这个方案的好处是不用额外写代码,Qt已经帮你处理了变换逻辑,缺点是只能按比例缩放,如果需要固定到某个像素尺寸,可能需要先计算比例。

方法二:自定义size属性适配QPropertyAnimation

如果需要直接按像素尺寸来控制动画(比如从100x100变到300x300),可以在你的Pixmap类里自定义一个size属性,让QPropertyAnimation可以直接操作它。

步骤1:在Pixmap类中声明自定义属性

在头文件里添加Q_OBJECT宏和属性声明:

#include <QGraphicsPixmapItem>
#include <QPropertyAnimation>

class Pixmap : public QGraphicsPixmapItem
{
    Q_OBJECT
    Q_PROPERTY(QSize size READ size WRITE setSize NOTIFY sizeChanged) // 声明自定义size属性

public:
    explicit Pixmap(QGraphicsItem* parent = nullptr);
    QSize size() const;
    void setSize(const QSize& newSize);

signals:
    void sizeChanged();

private:
    QSize m_currentSize;
};

步骤2:实现属性的getter和setter

在cpp文件里实现对应的方法,在setter中更新pixmap的尺寸:

Pixmap::Pixmap(QGraphicsItem* parent) : QGraphicsPixmapItem(parent)
{
    // 初始化尺寸为初始pixmap的大小
    if (!pixmap().isNull()) {
        m_currentSize = pixmap().size();
    }
}

QSize Pixmap::size() const
{
    return m_currentSize;
}

void Pixmap::setSize(const QSize& newSize)
{
    if (m_currentSize != newSize) {
        m_currentSize = newSize;
        // 缩放pixmap,这里可以根据需求选择缩放模式
        QPixmap scaledPix = pixmap().scaled(newSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
        setPixmap(scaledPix);
        emit sizeChanged(); // 必须触发信号,让动画感知属性变化
    }
}

步骤3:使用自定义属性创建动画

现在就可以像操作内置属性一样,用QPropertyAnimation来控制size了:

Pixmap* myPixmap = new Pixmap();
myPixmap->setPixmap(QPixmap("your_image_path.png"));

QPropertyAnimation* sizeAnim = new QPropertyAnimation(myPixmap, "size");
sizeAnim->setDuration(1500);
sizeAnim->setStartValue(QSize(100, 100));
sizeAnim->setEndValue(QSize(300, 300));
sizeAnim->start();

方法三:用QVariantAnimation手动处理帧更新

如果不想自定义属性,也可以用QVariantAnimation来实现,它会在每一帧触发valueChanged信号,你可以在回调里手动调整pixmap的尺寸。

示例代码:

Pixmap* myPixmap = new Pixmap();
myPixmap->setPixmap(QPixmap("your_image_path.png"));

QVariantAnimation* anim = new QVariantAnimation();
anim->setDuration(1000);
anim->setStartValue(QSize(100, 100));
anim->setEndValue(QSize(200, 200));

// 绑定帧更新回调
connect(anim, &QVariantAnimation::valueChanged, [=](const QVariant& value) {
    QSize targetSize = value.toSize();
    QPixmap scaledPix = myPixmap->pixmap().scaled(targetSize, Qt::KeepAspectRatio);
    myPixmap->setPixmap(scaledPix);
});

anim->start(QAbstractAnimation::DeleteWhenStopped);

这个方案的灵活性最高,你可以在回调里加入任何额外逻辑(比如调整位置、旋转等),但需要自己处理帧的更新逻辑。


内容的提问来源于stack exchange,提问作者Kamil Turek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:18:37