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

原文地址:https://www.cnblogs.com/linkyip/p/14462288.html