zoukankan      html  css  js  c++  java
  • C++共享枚举类型给QML

    C++共享枚举类型给QML

    • 由于Qt5.10之前的版本不支持枚举类型, 所以我们采用了在C++中实现一个类, 注册到QML中的方式, 来使C++中的枚举类型共享给QML
    • 示例说明: 示例枚举为1~12月, 接受到对应的枚举, 在界面中显示对应中文.

    在C++中创建类

    • 前提(和信号槽的前提一样):
      • 从QObject或其子类继承, 这里直接使用QObject继承即可
      • 使用Q_OBJECT宏
    • 关键点: 使用Q_ENUMS包裹枚举, Q_ENUMS置于类的上方, 不可放到public等后面.
    • 代码如下:

    e_nums.h

    #ifndef E_NUMS_H
    #define E_NUMS_H
    #include <QObject>
    
    //该类用于向QML注册枚举类型
    class E_NUMS: public QObject
    {
        Q_OBJECT
        Q_ENUMS(E_MONTHS)
    public:
        E_NUMS(QObject *parent = nullptr);
        ~E_NUMS();
    public:
        //月份枚举
        enum E_MONTHS{
            January,
            February,
            March,
            April,
            May,
            June,
            July,
            August,
            September,
            October,
            November,
            December
        };
    };
    
    #endif // E_NUMS_H
    
    

    e_nums.cpp

    #include "e_nums.h"
    E_NUMS::E_NUMS(QObject *parent):QObject (parent)
    {
    }
    
    E_NUMS::~E_NUMS()
    {
    }
    

    向QML中注册上面创建的E_NUMS类

    • 关键点: 使用qmlRegisterType注册类
    • 代码如下:

    main.cpp

    #include <QGuiApplication>
    #include <QQmlApplicationEngine>
    #include "e_nums.h"
    
    int main(int argc, char *argv[])
    {
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    
        QGuiApplication app(argc, argv);
    
        qmlRegisterType<E_NUMS>("com.e_nums",1,0,"E_NUMS");
    
        QQmlApplicationEngine engine;
    
        engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
        if (engine.rootObjects().isEmpty())
            return -1;
    
        return app.exec();
    }
    

    在QML中使用枚举类型

    • 关键点: QML中使用import导入E_NUMS类, 就可以在QML中使用枚举了.
    • 代码如下:

    main.qml

    import QtQuick 2.9
    import QtQuick.Window 2.2
    import com.e_nums 1.0
    
    Window {
        visible: true
         640
        height: 480
        title: qsTr("Hello World")
        Text {
            id: testText
            text: qsTr("text")
            Component.onCompleted: {
                var i = E_NUMS.February;    //这里随便定义一个变量举例
                switch(i)
                {
                case E_NUMS.January:
                    testText.text = "1月";
                    break;
                case E_NUMS.February:
                    testText.text = "2月";
                    break;
                case E_NUMS.March:
                    testText.text = "3月";
                    break;
                case E_NUMS.April:
                    testText.text = "4月";
                    break;
                case E_NUMS.May:
                    testText.text = "5月";
                    break;
                case E_NUMS.June:
                    testText.text = "6月";
                    break;
                case E_NUMS.July:
                    testText.text = "7月";
                    break;
                case E_NUMS.August:
                    testText.text = "8月";
                    break;
                case E_NUMS.September:
                    testText.text = "9月";
                    break;
                case E_NUMS.October:
                    testText.text = "10月";
                    break;
                case E_NUMS.November:
                    testText.text = "11月";
                    break;
                case E_NUMS.December:
                    testText.text = "12月";
                    break;
                default:
                    break;
                }
            }
        }
    }
    

    以上完整代码已上传git, 地址: https://gitee.com/linkyip/test_qml_enum

  • 相关阅读:
    3D打印开源软件Cura分析(1) 【转】
    【机械臂】机械臂快速入门【转】
    Gcode命令【转】
    初识Vulkan【转】
    模型视图变换时,法线向量要乘模型视图矩阵的逆转置矩阵【转】
    OpenSceneGraphic 着色器中数组的应用【转】
    Docker容器的重启策略及docker run的--restart选项详解
    Linux LVM简明教程
    /etc/resolv.conf被自动修改
    ansible判断对指定主机组执行task , when: inventory_hostname in {{ groups['group'] }} does not work with dynamic inventory
  • 原文地址:https://www.cnblogs.com/linkyip/p/14462288.html
Copyright © 2011-2022 走看看