2

我正在尝试在 QLabel 中对 QPixmap 的变化进行动画处理。

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

使用mousePressEvent()我可以使用setPixmap(). 但是,这只是在每个 QLabel 中切换图像,而我想要实现的是一个新图像滑过现有图像的动画。

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

任何想法或想法表示赞赏。

4

2 回答 2

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();
    }
};
于 2011-09-20T07:27:35.550 回答
2

QLabel 从未为此类用途而设计。在 QGraphicsView 中绘制 QPixmap,它更侧重于渲染效果和动画。

于 2011-09-19T20:15:36.100 回答