• QML的使用


    一、背景

    为了适应手机移动应用开发, Qt5 将 QML 脚本编程提到与传统 C++ 部件编程相同的高度,力推 QML 界面编程,当然 QML 主要用于手机移动应用程序。 QML 包含大量使用手机移动设备的功能模块,比如基本部件(QtQuick 模块)、GPS 定位、渲染特效、蓝牙、NFC、WebkKit 等等。

    QML(Qt Meta-Object Language,Qt元对象语言)是一种用于描述应用程序用户界面的声明式编程语言, 类似于网页设计的 HTML,是一种标记语言,我们可以借助 CSS 对它进行美化,也可以借助 JavaScript 进行交互。有 Web 开发经验的读者学习 QML 将非常轻松。

    二、QML基础介绍

    QML将界面分解为一个一个小的元素,通过使用QML描述各元素的排列以及对特定事件的响应来搭建一个动态的界面。QML中的元素是以层级的形式进行描述的,子元素继承父元素的坐标系统,子元素的坐标以父元素作为参考,父元素的左上角为子元素的坐标原点,子元素中可以使用parent关键字引用父元素。

    现在创建一个QML工程。打开Qt Creator,点击“文件→新建文件或项目”菜单项,然后选择创建“Qt QuickApplication”,如下图所示:

     点击下一步,就创建好了

    在一个QML文件中,每个元素都可以设定唯一的id,在其他元素中可以引用id来更改此元素的属性等。QML提供一系列内置的元素类型供开发中快速搭建界面,包括最常用的Rectangle、Image、Text、MouseArea、Item等。元素都有自己内置的属性,比如之前介绍的id,以及用于指定坐标的x、y,和width、height等,同时也支持使用property关键字自定义属性。

    我们添加一个简单的QML文件:

    1. import QtQuick 2.0
    2. Rectangle {
    3. width: 100
    4. height: 200
    5. color: "red"
    6. radius: 50
    7. }

    修改文件路径

    运行:

    使用Rectangle就可以构建出消息展示框和按钮等大部分的界面元素了,而Text类型可以用于在Rectangle中增加文字信息,Image可以加载图片,MouseArea提供鼠标/触摸屏事件,组合使用这几个元素就能够快速的搭建基本的交互界面了。

     三、动画效果

    QML也内置了一些类型来描述显示元素的转变、动画效果,例如PropertyAnimation、NumberAnimation、ColorAnimation、RotationAnimation以及State、Transition等,使用这些类型能够快速实现界面的动画效果,比如下面展示一个绿灯闪烁的界面的QML代码:
     

    1. import QtQuick 2.0
    2. Rectangle {
    3. id: backgroud
    4. width: 100
    5. height: 100
    6. color: "grey"
    7.   Rectangle {
    8.     id: greenlight
    9.     width: 60
    10.     height: 60
    11.     x: 20
    12.     y: 20
    13.     color: "green"
    14.     radius: 30
    15.     Component.onCompleted: flick.start()
    16.     SequentialAnimation{
    17.       id: flick
    18.       ColorAnimation { target: greenlight; properties: "color"; to: "black"; duration: 1000 }
    19.       ColorAnimation { target: greenlight; properties: "color"; to: "green"; duration: 1000 }
    20.       ColorAnimation { target: greenlight; properties: "color"; to: "black"; duration: 1000 }
    21.       ColorAnimation { target: greenlight; properties: "color"; to: "green"; duration: 1000 }
    22.       ColorAnimation { target: greenlight; properties: "color"; to: "black"; duration: 1000 }
    23.       }
    24.   }
    25. }

    四、 Listview使用QML

    实际开发中,由于需要展示的数据往往会以数组等更复杂形式进行管理,这些数据具有相同的属性,需要展示的外形效果是一样的,而每个元素的需要展示的内容不一样,这时就可以使用Row、Column、ListView、GridView等更复杂的元素。这类元素的设计理念是将数据与展现效果分开,数据用model来存放,而展示效果用view来描述,model和view通过delegate联系起来,一个简单的ListView的用法示例如下,使用QT的demo——objectlistmodel:

    目录

     dataobject.h

    1. #ifndef DATAOBJECT_H
    2. #define DATAOBJECT_H
    3. #include
    4. class DataObject : public QObject
    5. {
    6. Q_OBJECT
    7. // 设置name,color属性
    8. Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
    9. Q_PROPERTY(QString color READ color WRITE setColor NOTIFY colorChanged)
    10. public:
    11. DataObject(QObject *parent=0);
    12. DataObject(const QString &name, const QString &color, QObject *parent=0);
    13. QString name() const;
    14. void setName(const QString &name);
    15. QString color() const;
    16. void setColor(const QString &color);
    17. signals:
    18. void nameChanged();
    19. void colorChanged();
    20. private:
    21. QString m_name;
    22. QString m_color;
    23. ]
    24. };
    25. #endif // DATAOBJECT_H

     dataobject.cpp

    1. #include
    2. #include "dataobject.h"
    3. DataObject::DataObject(QObject *parent)
    4. : QObject(parent)
    5. {
    6. }
    7. DataObject::DataObject(const QString &name, const QString &color, QObject *parent)
    8. : QObject(parent), m_name(name), m_color(color)
    9. {
    10. }
    11. QString DataObject::name() const
    12. {
    13. return m_name;
    14. }
    15. void DataObject::setName(const QString &name)
    16. {
    17. if (name != m_name) {
    18. m_name = name;
    19. emit nameChanged();
    20. }
    21. }
    22. QString DataObject::color() const
    23. {
    24. return m_color;
    25. }
    26. void DataObject::setColor(const QString &color)
    27. {
    28. if (color != m_color) {
    29. m_color = color;
    30. emit colorChanged();
    31. }
    32. }

    main.cpp

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include "dataobject.h"
    8. /*
    9. This example illustrates exposing a QList as a
    10. model in QML
    11. */
    12. int main(int argc, char ** argv)
    13. {
    14. QGuiApplication app(argc, argv);
    15. QList dataList;
    16. dataList.append(new DataObject("Item 1", "red"));
    17. dataList.append(new DataObject("Item 2", "green"));
    18. dataList.append(new DataObject("Item 3", "blue"));
    19. dataList.append(new DataObject("Item 4", "yellow"));
    20. QQuickView view;
    21. view.setResizeMode(QQuickView::SizeRootObjectToView);// 此属性保存当视图调整大小时是否重新布局项
    22. QQmlContext *ctxt = view.rootContext();
    23. ctxt->setContextProperty("myModel", QVariant::fromValue(dataList));
    24. view.setSource(QUrl("qrc:view.qml"));
    25. view.show();
    26. return app.exec();
    27. }

    view.qml

    1. import QtQuick 2.0
    2. ListView {
    3. width: 100; height: 100
    4. model: myModel
    5. delegate: Rectangle {
    6. height: 25
    7. width: 100
    8. color: model.modelData.color
    9. Text { text: name }
    10. }
    11. }

     

    参考:

    使用QML进行界面开发_cdemtronix的博客-CSDN博客_qml

    QML学习(二)—— - 走看看

    第52篇 Qt Quick简介 · Qt 快速入门系列教程

  • 相关阅读:
    基于单片机的超声波探伤仪设计
    LC655+offer070+offer069+offer072+662
    计算机毕业设计Java补课管理系统(源码+系统+mysql数据库+lw文档)
    卫浴服务信息展示预约小程序的作用如何
    【Redis】基本数据类型及使用场景介绍
    Vue插槽详解
    【Docker-k8s学习和实战】(三)Docker初试:启动第一个docker容器;docker容器的运行、停止、重启以及镜像的删除
    相机不小心格式化了怎么恢复?如何快速找回珍贵照片
    技术选型思考:分库分表和分布式DB(TiDB/OceanBase) 的权衡与抉择
    2023秋冬系列丨追求本真的自然纯粹之美
  • 原文地址:https://blog.csdn.net/sinat_31608641/article/details/126064820