Анимация замены изображения в Qt - PullRequest
2 голосов
/ 19 сентября 2011

Я пытаюсь анимировать изменение QPixmap внутри QLabel.

У меня есть MainWindow, которое содержит несколько объектов, производных от QScrollArea.Каждый из них содержит член QLabel.

Использование mousePressEvent() Я могу заменить изображение каждого QLabel, используя setPixmap().Однако это просто переключает изображение в каждом QLabel, в то время как я хотел бы добиться анимации, в которой новое изображение скользит по существующему.

Сначала я попытался с помощью QTimeLine нарисовать QPixmap на QLabel.я сам (для этого я создал класс, производный от QLabel, и написал свой собственный setPixmap ()), но это не сработало.Затем я попытался использовать QPropertyAnimation, но он не может быть создан на Pixmap, пока я не реализовал подкласс для этого.

Любые мысли или идеи приветствуются.

Ответы [ 2 ]

3 голосов
/ 20 сентября 2011

Вам понадобится 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();
    }
};
2 голосов
/ 20 сентября 2011

QLabel никогда не был разработан для такого использования.Нарисуйте свои QPixmaps внутри QGraphicsView, он гораздо больше сфокусирован на рендеринге эффектов и анимации.

...