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
    width: 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM