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_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()
{}
  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);
#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();
}
  1. 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;}
}

运行效果:

image

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用pyinstaller打包python3程序

pyInstaller是一款用于将pyhon程序打包成exe文件的工具&#xff0c;pyInstaller不是一个python的包&#xff0c; 只需要把pyInstaller的文件下载下来放到任意为止都可以&#xff0c;也就是说pyInstaller相当于独立出来专门干打包python的工具&#xff0c;这货是工具不是库&…

什么是递归函数?

文章目录递归函数递归例题特点效率优点递归函数 递归 递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身&#xff0c;每调用一次就进入新的一层。递归函数必须有结束条件。 当函数在一直递推&#xff0c;直到遇到墙后返回&#xff0c;这个墙就是结束条…

Angular的@Output与@Input理解

@Output与@Input理解 Output和Input是两个装饰器,是Angular2专门用来实现跨组件通讯,双向绑定等操作所用的。 @Input Component本身是一种支持 nest 的结构,Child和Parent之间,如果Parent需要把数据传输给child并在child自己的页面中显示,则需要在Child的对应 directiv…

腾讯云CDN配置

第一步&#xff1a;先去领取腾讯云CDN免费包23333333 以下为正式步骤&#xff1a; 在这里体现大家&#xff0c;域名一定要备案&#xff0c;另外要明白域名如何解析 前边问题不大&#xff0c;一切跟着腾讯云的套路来即可&#xff0c;需要注意的是网上后优化的配置大家可以自行…

Ubuntu中安装python3

通过命令行安装Python3.*&#xff0c;只需要在终端中通过命令行安装即可&#xff1a; sudo apt-get install python3 Ubuntu的底层大多数采用的是Python2.*&#xff0c;Python3和Python2是互相不兼容的&#xff0c;完全没法通用的&#xff08;也不知道他们怎么想的o(TヘTo)&a…

目标检测与分割总结

目标检测最常用的三个模型&#xff1a;Faster R-CNN、SSD和YOLO Faster R-CNN架构 在Faster RCNN中&#xff0c;候选框是经过RPN产生的&#xff0c;然后再把各个“候选框”映射到特征图上&#xff0c;得到RoIs。 Faster R-CNN步骤&#xff1a; (1) 由输入图片产生的区域候选…

win10连接烟台大学校园网

第一步 右键网络图标&#xff0c;打开网络管理中心 第二步&#xff1a; 设置添加新的网络&#xff0c;方法步骤如下&#xff1a; 第三步&#xff1a;新建VPN连接&#xff0c;注意协议为L2TP 第四步&#xff1a; 第五步&#xff1a; 第六步&#xff1a; 创建结束后进入更…

U-Net++粗略解释

Paper&#xff1a;UNet: A Nested U-Net Architecture for Medical Image Segmentation u-net网络的基本拓扑结构 目前最先进的图像分割模型是各种个同样的 encoder-decoder架构&#xff0c;他们具有一个关键的相似性&#xff1a;skip connections&#xff0c;它可以将编码器…

Docker+Nginx部署Angular

DockerNginx部署Angular 在部署Angular生产环境之前&#xff0c;需要电脑已经安装docker。 添加Dockerfile 在已经完成的Angular项目的项目根目录下添加Dockerfile文件。 Dockerfile文件内容&#xff1a; FROM nginx:1.11-1.11-alpine COPY index.html /usr/share/nginx/ht…

U-net网络详解

U-net网络 简单说一下网络图中各项所代表的内容&#xff1a; 蓝/白色框表示feature map(特征图) 蓝色箭头表示3x3卷积&#xff0c;主要用于特征提取 灰色箭头表示skip-connection&#xff08;跳跃连接&#xff0c;通常用于残差网络中&#xff09;,在这里是用于用于特征融合&…

SOLO算法简读

论文链接&#xff1a;https://arxiv.org/abs/1912.04488 代码链接&#xff1a;https://github.com/WXinlong/SOLO 摘要 提出一种新的实例分割方法。与语义分割等其他密集预测任务相比&#xff0c;实例分割的难度要大得多。为了预测每个实例的掩码&#xff0c;主流方法要么遵…

关于Loss的简单总结

Dice Loss 参考&#xff1a;https://blog.csdn.net/l7H9JA4/article/details/108162188 Dice系数&#xff1a; 是一种集合相似度度量函数&#xff0c;通常用于计算两个样本的相似度&#xff0c;取值范围为[0,1]。 s2∣X∩Y∣∣X∣∣Y∣s \frac{2|X ∩ Y|}{|X||Y|} s∣X∣∣Y…

SOLOv2论文简读

论文&#xff1a;SOLOv2: Dynamic, Faster and Stronger 代码&#xff1a;https://github.com/WXinlong/SOLO 摘要 主要提出了作者在SOLOv2中实现的优秀的实例分割方法&#xff0c;旨在创建一个简单、直接、快速的实例分割框架&#xff1a; 通过提出动态学习对象分割器的mas…

Ubuntu18.04 关于使用vnc的踩坑

由于种种原因&#xff0c;手上多了一台可使用的桌面版Ubuntu&#xff0c;正好用来测试代码&#xff0c;方便调试。因为只能远程&#xff0c;所以需要配置远程连接。因此就打算使用vnc进行远程连接&#xff0c;谁料一路坎坷&#xff0c;特此记录。 安装 设置桌面共享 需要注意…

App_Shell模型

App_Shell模型 App Shell 架构是构建 Progressive Web App 的一种方式,这种应用能可靠且即时地加载到您的用户屏幕上,与本机应用相似。 App shell是支持用户界面所需的最小的 HTML、CSS 和 JavaScript,如果离线缓存,可确保在用户重复访问时提供即时、可靠的良好性能。这意…

Jenkins自定义主题教程

Jenkins自定义主题 由于Jenkins自带的样式比较丑陋&#xff0c;所以有很多第三方的样式库&#xff0c;这里针对jenkins-material-theme样式库做一个安装教程。 下载样式库 下载连接 Select your color 选择一个你喜欢的主题颜色。Choose your company logo 上传你自定义的…

IndexedDB_Web 离线数据库

IndexedDB_Web 离线数据库 本文会从头剖析一下 IndexedDB 在前端里面的应用的发展。 indexedDB 目前在前端慢慢得到普及和应用。它正朝着前端离线数据库技术的步伐前进。以前一开始是 manifest、localStorage、cookie 再到 webSQL&#xff0c;现在 indexedDB 逐渐被各大浏览器认…

基于 Docker 的微服务架构

基于 Docker 的微服务架构-分布式企业级实践前言Microservice 和 Docker服务发现模式客户端发现模式Netflix-Eureka 服务端发现模式ConsulEtcdZookeeper 服务注册自注册模式 Self-registration pattern第三方注册模式 Third party registration pattern小结一 服务间的 IPC 机制…

funcode游戏实训,java及C/C++,网上整理

软件&#xff0c;常见错误都有。 所有资源可到公众号获取(源码也是)&#xff0c;不再直接分享

swing皮肤包 substance

分享一下swing皮肤包substance 资源可到公众号获取