Qt与QML的枚举绑定(C++枚举)

Qt到QML的枚举绑定

QML中是不支持c++的枚举类型的,所以我们可以使用Qt的元对象系统,即MOS,来帮助我们实现。

进行绑定的好处就是,以后数据发生变化的时候,就是枚举发生增加修改,添加等的时候,不需要在QML中进行修改了。

CombBox的model绑定C++的enum

  1. 实现C++类,这个类要继承QObject或者其子类
  2. 使用Q_ENUMS宏定义将我们需要暴露给QML环境中的数据进行包裹
//.hpp文件
#include <QObject>

class TestEnum : public QObject
{
    Q_OBJECT
    Q_ENUMS(myAlg)
public:
    enum class myAlg //class关键字在这里是c++11开始使用的,针对enum做了改进
    {
        AAA,
        BBB,
        CCC,
        DDD
    };

    explicit TestEnum(QObject *parent = nullptr);
    ~TestEnum();
signals:

public slots:
};
//这个是.cpp文件
TestEnum::TestEnum(QObject *parent) : QObject(parent)
{

}

TestEnum::~TestEnum()
{

}
  1. 将枚举导出到QML中的model,首先需要include QQmlContext头文件
//main.cpp文件

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext> //这个必须include

#include "testenum.hpp"

int main(int argc, char *argv[])
{
#if defined(Q_OS_WIN)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;



    TestEnum testEnum; //实例化需要导入到QML环境中的类
    //metaObject函数为QObject基类中的函数,获取元对象
    const QMetaObject* metaObj = testEnum.metaObject();
    //使用QT自带的元枚举,indexOfEnumerator是QMetaObject类中的方法,获取“myAlg”字符串的枚举
    //返回枚举器的索引,enumerator函数根据枚举器的索引返回元数据
    QMetaEnum enumType = metaObj->enumerator(metaObj->indexOfEnumerator("myAlg"));

    //根据返回的元数据,遍历其key和value,因为c++枚举本身是int类型,然后添加到QStringList内
    QStringList list;
    for(int i=0; i < enumType.keyCount(); ++i)
    {
        //enumType.key(i)为根据索引获取索引所代表的值,这里就是枚举的字符串
        //value(i)函数就是返回索引值,如果给定的索引值超出范围将返回-1
        QString item = QString::fromLatin1(enumType.key(i)) + "  "
                     + QString::number(enumType.value(i));
        list.append(item);
    }

    //QVariant::fromValue(list)将返回QML可以识别的model
    //这里的myModel为在QML环境中使用的变量名称,rootContext函数为获取父类QQmlEngine的指针
    //使用setContextProperty函数将其以上下文的方式注入QML环境中
    //所谓的上下文就是隐藏的全局属性,包括方法
    engine.rootContext()->setContextProperty("myModel", QVariant::fromValue(list));

    //这里要注意一点,load函数要在最后执行,否则将会导入上下文属性异常
    engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 

    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}
  1. QML中使用

QML中直接使用即可,因为我们在main.cpp内已经将他以上下文的形式导入到QML环境内了

import QtQuick 2.10 //这里是Qt 5.10版本,如果你的版本低,自己修改一下
import QtQuick.Controls 2.3 //这里是Qt 5.10版本,如果你的版本低,自己修改一下

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("test")

    ComboBox{
        id: cmbx;
        width: 300;
        model: myModel;
    }
}

运行效果:

image

备注:
1. 建议后面自己进行封装
2. 通过传入根对象的方式动态注入

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FlyWine

你的鼓励将是我创作的做大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值