Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt中的动画图像替换_Qt_Qlabel - Fatal编程技术网

Qt中的动画图像替换

Qt中的动画图像替换,qt,qlabel,Qt,Qlabel,我正在尝试在QLabel中设置QPixmap更改的动画 我有一个主窗口,其中包含几个从QScrollArea派生的对象。其中每一个都拥有一个QLabel成员 使用mousePressEvent()我可以使用setPixmap()替换每个QLabel的图片。然而,这只是切换每个QLabel中的图像,而我想要实现的是一个动画,其中新图像在现有图像上滑动 首先,我自己尝试使用QTimeLine在QLabel上绘制QPixmap(为此我创建了一个从QLabel派生的类,并编写了自己的setPixmap(

我正在尝试在QLabel中设置QPixmap更改的动画

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

使用
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图形视图框架。再次感谢。