2

QLabel内でQPixmapの変更をアニメーション化しようとしています。

QScrollArea から派生したいくつかのオブジェクトを保持する MainWindow があります。これらはそれぞれ QLabel メンバーを保持しています。

を使用mousePressEvent()して、各 QLabel の画像を置き換えることができ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 に答える