Qt中的动画图像替换
我正在尝试在QLabel中设置QPixmap更改的动画 我有一个主窗口,其中包含几个从QScrollArea派生的对象。其中每一个都拥有一个QLabel成员 使用Qt中的动画图像替换,qt,qlabel,Qt,Qlabel,我正在尝试在QLabel中设置QPixmap更改的动画 我有一个主窗口,其中包含几个从QScrollArea派生的对象。其中每一个都拥有一个QLabel成员 使用mousePressEvent()我可以使用setPixmap()替换每个QLabel的图片。然而,这只是切换每个QLabel中的图像,而我想要实现的是一个动画,其中新图像在现有图像上滑动 首先,我自己尝试使用QTimeLine在QLabel上绘制QPixmap(为此我创建了一个从QLabel派生的类,并编写了自己的setPixmap(
mousePressEvent()
我可以使用setPixmap()
替换每个QLabel的图片。然而,这只是切换每个QLabel中的图像,而我想要实现的是一个动画,其中新图像在现有图像上滑动
首先,我自己尝试使用QTimeLine在QLabel上绘制QPixmap(为此我创建了一个从QLabel派生的类,并编写了自己的setPixmap()),但没有成功。接下来,我尝试使用QPropertyAnimation,但如果不为其实现子类,它就无法在Pixmap上构建
任何想法或想法都是值得赞赏的。QLabel从来没有被设计用于这种用途。在QGraphicsView中绘制Qpixmap,它更侧重于渲染效果和动画。您需要一个具有可设置动画的属性的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();
}
};
嗨,很抱歉反应太晚,假期。。。我同意你的建议,使用了图形视图框架。动画现在似乎很好,但是有一个小问题。当我向场景中添加一个新的pixmapItem时,在我将其动画化到视图中之前,我得到了这种恼人的“闪烁”,即,你可以在一段(非常)短的时间内看到新的pixmap,然后返回到旧的pixmap,只有到那时新的pixmap才被动画化到视图中。有什么想法吗?这在pixmapItems和textItems中都会发生。我尝试了一个代码片段,但无法,我可以发送任何感兴趣的人。谢谢@CBAMBER85似乎在启动QTimeLine之前渲染了pixmap。您可能需要尝试将pixmap添加到qgraphicscene invisible,然后启动QTimeLine,然后将其设置为visible。这可能需要一些实验,这取决于Qt如何使用QAnimation的线程。嗨,谢谢你的回答。最后使用了qt图形视图框架。再次感谢。