日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

發布時間:2025/3/8 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt与QML的枚举绑定(C++枚举) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Qt到QML的枚舉綁定

QML中是不支持c++的枚舉類型的,所以我們可以使用Qt的元對象系統,即MOS,來幫助我們實現。

進行綁定的好處就是,以后數據發生變化的時候,就是枚舉發生增加修改,添加等的時候,不需要在QML中進行修改了。

CombBox的model綁定C++的enum

  • 實現C++類,這個類要繼承QObject或者其子類
  • 使用Q_ENUMS宏定義將我們需要暴露給QML環境中的數據進行包裹
  • //.hpp文件 #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: }; //這個是.cpp文件 TestEnum::TestEnum(QObject *parent) : QObject(parent) {}TestEnum::~TestEnum() {}
  • 將枚舉導出到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); #endifQGuiApplication 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)函數就是返回索引值,如果給定的索引值超出范圍將返回-1QString 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(); }
  • QML中使用
  • QML中直接使用即可,因為我們在main.cpp內已經將他以上下文的形式導入到QML環境內了

    import QtQuick 2.10 //這里是Qt 5.10版本,如果你的版本低,自己修改一下 import QtQuick.Controls 2.3 //這里是Qt 5.10版本,如果你的版本低,自己修改一下ApplicationWindow {visible: truewidth: 640height: 480title: qsTr("test")ComboBox{id: cmbx;width: 300;model: myModel;} }

    運行效果:

    備注:
    1. 建議后面自己進行封裝
    2. 通過傳入根對象的方式動態注入

    總結

    以上是生活随笔為你收集整理的Qt与QML的枚举绑定(C++枚举)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。