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