生活随笔
收集整理的這篇文章主要介紹了
Qt与QML的枚举绑定(C++枚举)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Qt到QML的枚舉綁定
QML中是不支持c++的枚舉類型的,所以我們可以使用Qt的元對象系統,即MOS,來幫助我們實現。
進行綁定的好處就是,以后數據發生變化的時候,就是枚舉發生增加修改,添加等的時候,不需要在QML中進行修改了。
CombBox的model綁定C++的enum
實現C++類,這個類要繼承QObject或者其子類使用Q_ENUMS宏定義將我們需要暴露給QML環境中的數據進行包裹
#include <QObject>class TestEnum :
public QObject
{Q_OBJECTQ_ENUMS(myAlg)
public:
enum class myAlg //
class關鍵字在這里是c++11開始使用的,針對
enum做了改進{AAA,BBB,CCC,DDD};
explicit TestEnum(QObject *parent = nullptr);~TestEnum();
signals:
public slots:
};
TestEnum::TestEnum(QObject *parent) : QObject(parent)
{}TestEnum::~TestEnum()
{}
將枚舉導出到QML中的model,首先需要include QQmlContext頭文件
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext> #include "testenum.hpp"int main(
int argc,
char *argv[])
{
#if defined(Q_OS_WIN)QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endifQGuiApplication app(argc, argv);QQmlApplicationEngine engine;TestEnum testEnum;
const QMetaObject* metaObj = testEnum.metaObject();QMetaEnum enumType = metaObj->enumerator(metaObj->indexOfEnumerator(
"myAlg"));QStringList
list;
for(
int i=
0; i < enumType.keyCount(); ++i){QString item = QString::fromLatin1(enumType.key(i)) +
" "+ QString::number(enumType.value(i));
list.append(item);}engine.rootContext()->setContextProperty(
"myModel", QVariant::fromValue(
list));engine.load(QUrl(QStringLiteral(
"qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -
1;
return app.exec();
}
QML中使用
QML中直接使用即可,因為我們在main.cpp內已經將他以上下文的形式導入到QML環境內了
import QtQuick 2
.10
import QtQuick
.Controls 2
.3 ApplicationWindow {
visible: truewidth: 640height: 480title: qsTr("test")ComboBox{id: cmbx;width: 300;model
: myModel;}
}
運行效果:
備注:
1. 建議后面自己進行封裝
2. 通過傳入根對象的方式動態注入
總結
以上是生活随笔為你收集整理的Qt与QML的枚举绑定(C++枚举)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。