前言

众所周知,如果要在 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. 讲解知识图谱成体系文章 (魔图互联知识图谱写的质量比较高的)
  2. javascript定时器
  3. 使用dbms_stats.gather_table_stats调整表的统计信息
  4. c语言约瑟夫环问题,C++_详解约瑟夫环问题及其相关的C语言算法实现,约瑟夫环问题 N个人围成一圈 - phpStudy...
  5. 有关编译嵌入式android的swap空间不够导致的编译错误和解决办法
  6. node生成uuid
  7. 为什么要多读书?多看书?
  8. Android源码学习
  9. ubuntu14 卸载 mysql_ubuntu14.04完全卸载mysql
  10. 涉密计算机涉密存储设备或者改作其他用途的,将未经安全技术处理的退出使用的涉密计算机涉密存储设备或者改作其他用途的依法给予处分...
  11. JUC的常用辅助工具
  12. 关于“.”与“->”使用的区别
  13. 六级考试-考前最后一背
  14. 大数据矩阵计算基础(二):R、Excel、Matlab中矩阵操作
  15. 车载服务器系统,车载系统平台与终端产品的介绍
  16. Mel频率倒谱系数-MFCC
  17. 大学生IT博客大赛 大赛评委
  18. python游戏库pygame经典教程
  19. mysql validate,MySQL密码强度审计插件:validate_password的使用说明
  20. GTC-700梯温析晶测定仪,梯度炉

热门文章

  1. 网易MCtalk Live:漫谈短视频平台概况,全面解读头部内容
  2. 【IBatis.Net】 各种配置说明
  3. RequiredFieldValidator----验证控件不起作用
  4. HDU 1724 Ellipse ——Simpson积分
  5. linux 安装sysstat使用iostat、mpstat、sar、sa
  6. JAVA struts2
  7. 公司招聘软件研发程序员的一道考题--MS SQL Server数据库数据文件页面头部结构...
  8. AIX忘记root密码后,重设密码步骤
  9. [转载]迅速成长的两个重要途径
  10. css在线留言星号,使用CSS 给表单必选项添加星号的实现方法