在 Qt 中移动图像(作为动画)的简单示例?

Posted

技术标签:

【中文标题】在 Qt 中移动图像(作为动画)的简单示例?【英文标题】:Simple example of moving an image (as an animation) in Qt? 【发布时间】:2021-11-01 01:24:27 【问题描述】:

我想在 Qt 中加载一个图像,并在动画中沿 x 轴移动它。

就是这样。我四处搜索,但大多数示例都远比这复杂得多,或者使用利用 Qt 绘图功能的几何形状。

这里有没有人有一个示例的链接,该示例只涵盖了我的简单用例?

【问题讨论】:

查看doc.qt.io/qt-5/qpropertyanimation.html,它给出了一个简单的例子。在您的情况下,您希望为x 属性而不是geometry 设置动画。 doc.qt.io/qt-5/qwidget.html#properties 谢谢,看起来方向正确。该示例使用“mywidget”。如果是图像,我会为该小部件使用什么类型?图像?我是 Qt 的绝对初学者。 答案取决于您使用图像的方式。例如,如果图像只是 UI 转换的一部分,则将其加载到 QPixmap 中可能是有意义的,然后将其设置在 QLabel 上并为标签设置动画。如果您设想一个包含多个运动图像的更复杂的场景,您可以查看 QGraphicsScene。你能更具体地介绍一下上下文吗? 我先用一张图来测试一下。 QLabel 会做我猜。谢谢。 【参考方案1】:

使用QTimer 实现非常简单。

结果是:

所以我的代码:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QTimer>
#include <QImage>
#include <QGraphicsEllipseItem>
#include <QVBoxLayout>
#include <QLabel>

class SimpleAnimation : public QWidget

    Q_OBJECT

public:
    SimpleAnimation(QWidget *parent = nullptr)
        : QWidget(parent)
    
        QPixmap image(":/0_0.png");
        m_label = new QLabel(this);
        m_label->setPixmap(image);

        QVBoxLayout* mainLayout = new QVBoxLayout;
        mainLayout->addWidget(m_label);

        setLayout(mainLayout);
        m_timer = new QTimer(this);
        connect(m_timer, &QTimer::timeout, this, &SimpleAnimation::onTimeout);
        m_timer->start(100);

    
    ~SimpleAnimation()
    
    

protected slots:
    void onTimeout()
    
        QPoint oldPosition = m_label->pos();
        QPoint newPosition = QPoint(oldPosition.x() + 10, oldPosition.y());

        m_label->move(newPosition);
    

private:
    QLabel* m_label;
    QTimer* m_timer;

;
#endif // MAINWINDOW_H

当超时信号发出时,我们得到QLabel的位置,将x加10,然后将我们的QLabel移动到新的位置。

当然,您可以将QGraphicsScene 用于图像。更适合管理大量 2D 对象。 QGraphicsScene 设置为 QGraphicsView,但对于一张图像,则不需要。

【讨论】:

小心,你的班级SimpleAnimation内存不安全! 我将这些连接:connect(m_timer, &amp;QObject::destroyed, this, &amp;SimpleAnimation::timerDelete);connect(m_label, &amp;QObject::destroyed, this, &amp;SimpleAnimation::timerDelete); connect(mainLayout, &amp;QObject::destroyed, this, &amp;SimpleAnimation::timerDelete); 添加到我的构造函数和void timerDelete() qDebug()&lt;&lt; "timerDelete"; 插槽以检查它是否删除。它返回我timerDelete 三次。所以我所有的对象都被破坏了,它没有内存泄漏 我不知道connect 做了什么,但如果你能处理它,那好吧!虽然,我认为您实现该类的方式很棘手,并且将来可能很难被其他人甚至您自己重用! @АндреасХаджигеоргиу 感谢您的建议,您是对的,但我正在制作一个简单的示例,初学者可以在 IDE 中复制并查看结果。在生产项目中,程序员自然会做出更好的设计 是的,不用担心我理解你的意图!另外,我只是想指出在他们的程序中不小心复制此类可能会引入的潜在内存泄漏。为了让文章更简洁!!!

以上是关于在 Qt 中移动图像(作为动画)的简单示例?的主要内容,如果未能解决你的问题,请参考以下文章

持续时间长于更新时的 Qt 进度条动画

Qt移动应用开发:应用粒子特效

Qt移动应用开发:使用动画框架

使用核心动画在屏幕上移动 UIImage

在核心动画中,红框代替 UIImage 视图移动

不移动鼠标光标时Java动画口吃