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