前言

众所周知,如果要在 QML使用 C++中定义的类型,有些数据类型是是可以直接使用的,如常见的 int,但是还有一些相对特殊的类型就需要做些特定的操作才可以使用了,那么,这里来看一下如何在 QML 中使用 C++中定义的枚举类型。

正文

1

要将自定义枚举用作数据类型,必须注册其类,并且还必须使用Q_ENUM()声明枚举,以将其注册到Qt的元对象系统。
话不多说,直接上代码:

首先我们定义一个类,继承于 QObject,然后在类中定义一个枚举类型

#include <QObject>class Message : public QObject
{Q_OBJECTQ_PROPERTY(Status status READ getStatus WRITE setStatus NOTIFY sigStatusChanged)
public:explicit Message(QObject *parent = nullptr);enum Status{Ready,Loading,Finished};Q_ENUM(Status)Status getStatus() const{return m_status;}void setStatus(Status st){m_status = st;emit sigStatusChanged(st);}signals:void sigStatusChanged(Status st);private:Status m_status;
};

然后将 Message 类注册成 QML 可使用的类型:

qmlRegisterType<Message>("Message",1,0,"Message");

然后在 QML 中直接进行调用:

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3
import Message 1.0Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Message{id:msgonSigStatusChanged: {console.log("status = ",st)}}Row{anchors.centerIn: parentButton{text: "Ready"onClicked: {console.log("Ready btn clicked")msg.status = Message.Ready}}Button{text: "Loading"onClicked: {console.log("Loading btn clicked")msg.status = Message.Loading}}Button{text: "Finished"onClicked: {console.log("Finished btn clicked")msg.status = Message.Finished}}}}

为方便演示,我这里定义了三个按钮,点击每个按钮切换可以分别设置 status,然后在 QML 中查看打印信息,看是否为我们想要的结果。

代码跑起来:

输出打印信息:

qml: Ready btn clicked
qml: status =  0
qml: Loading btn clicked
qml: status =  1
qml: Finished btn clicked
qml: status =  2

通过打印信息可以看到,当前 status 已经发生了变化。
以上是最基本的枚举使用方法。
注意:枚举值的名称必须以大写字母开头,以便可以从QML访问。

2

定义枚举时,还有一种写法,如下:

enum class Status{Ready,Loading,Finished};Q_ENUM(Status)

就是在枚举名前面加一个class,这叫枚举类,枚举类QML中注册为范围和非范围属性。该Ready值将在Message.Status.Ready和注册Message.Ready。
所以如果这种写法就可以直接在 QML 中通过Message.Status.Ready来调用了。

3

上面说到的枚举类的用途通常是,当有多个枚举定义时,并每个枚举值的名称如果有重复,如 A 枚举中的值是 value1,value2,而枚举 B 里面也包含value1,value2两个值,这时候就需要用到枚举类,要不然会报错。

定义为枚举类后,如果直接通过类名获取枚举值,那么在后面定义的值将会替换前面定义的枚举值。来看个示例:

#include <QObject>class Message : public QObject
{Q_OBJECT
public:explicit Message(QObject *parent = nullptr);enum class Status{Ready= 0,Loading,Finished};enum class StatusTwo{Ready = 4,Loading,Finished};Q_ENUM(Status)Q_ENUM(StatusTwo)
};

这里定义了两个枚举,其枚举成员的名称是一样的,这时候如果直接通过Message.Ready来引用,结果将为4,如下:

Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Message{id:msgComponent.onCompleted: {console.log("Message.Ready=",Message.Ready)console.log("Message.Loading=",Message.Loading)console.log("Message.Finished=",Message.Finished)console.log("Message.Status.Ready=",Message.Status.Ready)console.log("Message.Status.Loading=",Message.Status.Loading)console.log("Message.Status.Finished=",Message.Status.Finished)console.log("Message.StatusTwo.Ready=",Message.StatusTwo.Ready)console.log("Message.StatusTwo.Loading=",Message.StatusTwo.Loading)console.log("Message.StatusTwo.Finished=",Message.StatusTwo.Finished)}}
}

输出结果:

qml: Message.Ready= 4
qml: Message.Loading= 5
qml: Message.Finished= 6qml: Message.Status.Ready= 0
qml: Message.Status.Loading= 1
qml: Message.Status.Finished= 2qml: Message.StatusTwo.Ready= 4
qml: Message.StatusTwo.Loading= 5
qml: Message.StatusTwo.Finished= 6

结果很明显,只有通过枚举类的方式来调用才能得到正确的值。

4

若想在 QML 中定义信号,并且信号是带枚举类型参数的,那么定义信号的参数可以直接写成 int 类型,如下

Message{id:msgsignal sigSendStatus(int status)Component.onCompleted: {sigSendStatus(Message.Ready)}}

OK,关于 QML 中使用 C++定义的枚举类型介绍就到这里。
上述的两份源码在这里

QML和C ++之间的数据类型转换---枚举相关推荐

  1. QML和C ++之间的数据类型转换

    QML和C ++之间的数据类型转换 QML和C ++之间的数据类型转换 Data Ownership 基本Qt数据类型 QObject派生的类型 Qt和JavaScript类型之间的转换 QVaria ...

  2. QML和C++之间的数据类型转换

    在 QML 和 C++ 之间交换数据值时,QML 引擎会将它们转换为适合在 QML 或 C++ 中使用的正确数据类型. 这要求交换的数据属于引擎可识别的类型. QML 引擎为大量 Qt C++ 数据类 ...

  3. MYSQL 与 Oracle 之间的数据类型转换

    2009-07-21 MYSQL 与 Oracle 之间的数据类型转换 关键字: mysql, oracle, 数据类型, 转换 Table 2-4 Default Data Type Mapping ...

  4. mysql oracle 数据类型转换_Mysql与Oracle之间的数据类型转换

    [转]MYSQL 与 Oracle 之间的数据类型转换

  5. 两个框架之间的数据类型转换,需要桥接技术

    两个框架之间的数据类型转换,需要桥接技术 在所有的数据类型见面添加__bridge去修饰

  6. Java中如何实现Date与String之间的数据类型转换

    String 数据类型转换成 Date String inputDate = "2021-04-11";Date outputDate = null;SimpleDateForma ...

  7. [OpenCV] CV_32F与CV_8U之间的数据类型转换

    OpenCV CV_32F与CV_8U之间的类型转换 文章目录 OpenCV CV_32F与CV_8U之间的类型转换 前言 一.OpenCV都有哪些数据类型 二.代码实例 总结 前言 最近在c++使用 ...

  8. 【数据传输 1】服务器—>客户端之间的数据类型转换

    导读:在做项目的时候,在controller中,将List数据类型转换为了JSON字符串,那么,为什么要将其数据转换为JOSN呢?这样的转换是否是必须的,在这个转换过程中,又经过了那些步骤?注:本篇博 ...

  9. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(8) - 数据类型转换指令

    SSE Conversion Instructions SSE的转换指令支持组合的/标量的单精度浮点数与双字整型数(32字节)之间的数据类型转换. 以下两条指令将整型数转换为浮点数. 指令 描述 CV ...

最新文章

  1. boost::neighbor_bfs_visitor用法的测试程序
  2. 关于“数据分析”如何快速入门一些基本思路
  3. lora信号测试小助手_433m无线收发模块LoRaF30如何进行距离测试
  4. 项目交接文档_项目管理反思
  5. 病毒周报(100118至100124)
  6. js先执行一个方法再往下执行_轻松理解JS中的面向对象,顺便搞懂prototype和__proto__...
  7. 中国最美的十大宗教名山(图)
  8. 苹果手机有没有计算机记录,苹果手机中的safari浏览记录怎么恢复?苹果恢复大师教你...
  9. 「产品读书」增长黑客:创业公司的用户与收入增长秘籍
  10. python实现手机连续点击
  11. 吉林大学计算机系高级语言程序设计(C语言)期末题目及解答(上)
  12. 科力锐助力政务云统一灾备中心建设
  13. APP被Rejected 的各种原因翻译(转)
  14. 全能UI设计师到底需要具备哪些能力呢?
  15. 计算机专业领域和英语,专业、领域和职业的英语表达法
  16. 快学excel-VBA创建数据透视表
  17. 机器学习入门--唤起你的数学记忆
  18. NSIS软件打包 脚本代码详解
  19. Python自学要多久?
  20. VS2015+WDK 配置驱动开发环境

热门文章

  1. AI圈最新深度学习量化算法!
  2. 网易云信三周年:我们只做第一
  3. 利用Docker/Ansible实现轻量集群服务部署(视频演示+彩蛋)
  4. golang 基于Mac os 构建镜像
  5. robot framework安装
  6. 基于环信的仿QQ即时通讯的简单实现
  7. EntityFramework Core 2.0自定义标量函数两种方式
  8. Mac 10.12为打开终端增加快捷键(转)
  9. fresco xml配置属性不起作用
  10. 漫游Kafka之过期数据清理