QML之动画的使用(含源码+注释)

一、动画效果示例图

下图演示四组动画效果分别包含数值动画(单个方块、多个方块),顺序动画,并行动画等效果
在这里插入图片描述

二、个人理解

  1. NumberAnimation:改变控件属性值的动画效果,可针对坐标位置(x,y)、大小(width、height)、透明度等参数改变动画。
  2. SequentialAnimation:顺序动画,作用域包含的多个动画从上到下依次运行动画效果。
  3. ParallelAnimation:并行动画,作用域包含的多个动画同时运行。
  4. 其他动画:QML还包含PropertyAnimation、RotationAnimation、ColorAnimation等动画效果,可根据实际需求使用具体效果。

三、源码

import QtQuick 2.0
import QtQuick.Controls 2.12

Item {

        Button {
            id: btnNumForSingle
            text: "属性动画(单个)"
            onClicked: {
                rect1.resetPos() // 重置方块位置
                numAnimForSingle.start() // 动画启动
            }
        }

        Button {
            id: btnNumForMuilt
            text: "属性动画(多个)"
            anchors.left: btnNumForSingle.right
            onClicked: {
                numAnimForMulti.resetPos() // 重置方块位置
                numAnimForMulti.start() // 动画启动
            }
        }

        Button {
            id: btnNumForSequen
            text: "顺序动画"
            anchors.left: btnNumForMuilt.right
            onClicked: {
                rect1.resetPos() // 重置方块位置
                sequentialAnim.start() // 动画启动
            }
        }

        Button {
            id: btnNumForParallel
            text: "并行动画"
            anchors.left: btnNumForSequen.right
            onClicked: {
                rect1.resetPos() // 重置方块位置
                parallelAnim.start() // 动画启动
            }
        }

        Rectangle {
            id: rect1
            x: 20
            y: 300
            width: 50
            height: 50
            visible: true
            color: "skyblue"
            function resetPos() {
                x = 20
                y = 300
            }
        }



        Rectangle {
            id: rect2
            x: 20
            y: 370
            width: 50
            height: 50
            visible: true
            color: "lightgreen"
            function resetPos() {
                x = 20
                y = 370
            }
        }

    // 单元素动画
    NumberAnimation {
        id: numAnimForSingle
        target: rect1
        property: "x"
        duration: 2000
        to: 500
        easing.type: Easing.InOutQuad   // 动画效果
    }

    // 多元素对象动画
    NumberAnimation {
        id: numAnimForMulti
        targets: [rect1, rect2]
        properties: "x,y"
        duration: 2000
        to:350
        function resetPos() {
            rect1.resetPos()
            rect2.resetPos()
        }
    }

    //! 多动画组合
    // 顺序动画
    SequentialAnimation {
        id:sequentialAnim
        NumberAnimation {
            target: rect1
            property: "x"
            duration: 2000
            to: 500
        }

        NumberAnimation {
            target: rect1
            property: "y"
            duration: 2000
            to: 200
        }

    }

    // 并行动画
    ParallelAnimation {
        id:parallelAnim
        NumberAnimation {
            target: rect1
            property: "x"
            duration: 2000
            to: 500
        }

        NumberAnimation {
            target: rect1
            property: "y"
            duration: 2000
            to: 200
        }
    }
}

总结

记录一下简易的QML动画效果使用,包含的动画效果考研根据需求使用,可能会有意想不到的收获。

友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 o/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
QML中,可以通过C++来注入一个对象供QML使用。这个过程涉及到以下几个步骤: 1. 创建一个C++类,该类将作为注入给QML使用的对象。这个类需要继承自QObject,并且需要使用Q_OBJECT宏进行声明,以支持信号与槽的机制。 2. 在C++类中,可以定义一些属性、方法和信号,这些将在QML中被调用和访问。 3. 在main函数中,创建一个QGuiApplication或者QApplication实例,并注册C++类到QML引擎中。可以使用qmlRegisterType函数来完成注册,该函数需要传入C++类的名称、命名空间、版本号等信息。 4. 在QML文件中,通过import语句导入C++类所在的命名空间,并且可以直接使用该类的实例。 下面是一个示例代码,演示了如何在QML中注入一个C++对象供使用: ```cpp // MyObject.h #ifndef MYOBJECT_H #define MYOBJECT_H #include <QObject> class MyObject : public QObject { Q_OBJECT Q_PROPERTY(QString message READ message WRITE setMessage NOTIFY messageChanged) public: explicit MyObject(QObject *parent = nullptr); QString message() const; void setMessage(const QString &message); signals: void messageChanged(); private: QString m_message; }; #endif // MYOBJECT_H ``` ```cpp // MyObject.cpp #include "MyObject.h" MyObject::MyObject(QObject *parent) : QObject(parent) { } QString MyObject::message() const { return m_message; } void MyObject::setMessage(const QString &message) { if (m_message != message) { m_message = message; emit messageChanged(); } } ``` ```cpp // main.cpp #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QQmlContext> #include "MyObject.h" int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; // 注册C++类到QML引擎中 qmlRegisterType<MyObject>("com.example", 1, 0, "MyObject"); MyObject myObject; myObject.setMessage("Hello from C++!"); // 将C++对象设置为上下文属性,以便在QML使用 engine.rootContext()->setContextProperty("myObject", &myObject); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); } ``` ```qml // main.qml import QtQuick 2.15 import com.example 1.0 Item { width: 200 height: 200 Text { text: myObject.message anchors.centerIn: parent } } ``` 在上面的示例中,我们创建了一个名为MyObject的C++类,并在QML使用了它的message属性。在main函数中,我们注册了MyObject类,并将其实例设置为上下文属性,以便在QML中访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lw向北.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值