我正在尝试在QLabel中为QPixmap的更改设置动画。
我有MainWindow,它包含几个派生自QScrollArea的对象。每个人都拥有一个QLabel成员。
使用mousePressEvent()
我可以使用setPixmap()
替换每个QLabel的图片。然而,这只是简单地切换每个QLabel中的图像,而我想要实现的是一个新图像在现有图像上滑动的动画。
首先我尝试使用QTimeLine自己在QLabel上绘制QPixmap(我已经为此创建了一个派生自QLabel的类,并编写了我自己的setPixmap())但是这样做不起作用。接下来我尝试使用QPropertyAnimation,但是如果没有我为它实现子类,它就无法在Pixmap上构建。
感谢任何想法或想法。
答案 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,它更注重渲染效果和动画。