在Qt中动画图像替换

时间:2011-09-19 14:14:39

标签: qt qlabel

我正在尝试在QLabel中为QPixmap的更改设置动画。

我有MainWindow,它包含几个派生自QScrollArea的对象。每个人都拥有一个QLabel成员。

使用mousePressEvent()我可以使用setPixmap()替换每个QLabel的图片。然而,这只是简单地切换每个QLabel中的图像,而我想要实现的是一个新图像在现有图像上滑动的动画。

首先我尝试使用QTimeLine自己在QLabel上绘制QPixmap(我已经为此创建了一个派生自QLabel的类,并编写了我自己的setPixmap())但是这样做不起作用。接下来我尝试使用QPropertyAnimation,但是如果没有我为它实现子类,它就无法在Pixmap上构建。

感谢任何想法或想法。

2 个答案:

答案 0 :(得分:3)

您需要一个具有可动画属性的QObject,并为动画生成中间帧。一个不完整的例子:

class LabelAnimator : public QObject
{
    Q_OBJECT
    Q_PROPERTY(float progress READ progress WRITE setProgress)
public:
    LabelAnimator(QLabel* label) : mProgress(0.0f), 
                                   mLabel(label), 
                                   mAnimation(new QPropertyAnimation(this, "progress", this) 
    {
        mAnimation->setStartValue(0.0f);
        mAnimation->setEndValue(1.0f);
    }
    void setProgress(float progress) { 
        mProgress = progress;
        QPixmap pix = mOriginalPixmap;
        int offset = - mLabel->width() * (1.0f-progress);
        QPainter painter(&pix);
        painter.paint(off, 0, mNewPixmap);
        painter.end();
        mLabel->setPixmap(pix);
    }
    void setPixmap(const QPixmap& pix) {
        mOriginalPixmap = mLabel->pixmap();
        mNewPixmap = pix;
        mAnimation->start();
    }
};

答案 1 :(得分:2)

QLabel从未被设计用于此类用途。在QGraphicsView中绘制QPixmaps,它更注重渲染效果和动画。