QML和C ++之间的数据类型转换---枚举
前言
眾所周知,如果要在 QML使用 C++中定義的類型,有些數(shù)據(jù)類型是是可以直接使用的,如常見的 int,但是還有一些相對(duì)特殊的類型就需要做些特定的操作才可以使用了,那么,這里來(lái)看一下如何在 QML 中使用 C++中定義的枚舉類型。
正文
1
要將自定義枚舉用作數(shù)據(jù)類型,必須注冊(cè)其類,并且還必須使用Q_ENUM()聲明枚舉,以將其注冊(cè)到Qt的元對(duì)象系統(tǒng)。
話不多說(shuō),直接上代碼:
首先我們定義一個(gè)類,繼承于 QObject,然后在類中定義一個(gè)枚舉類型
#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 類注冊(cè)成 QML 可使用的類型:
qmlRegisterType<Message>("Message",1,0,"Message");然后在 QML 中直接進(jìn)行調(diào)用:
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}}}}為方便演示,我這里定義了三個(gè)按鈕,點(diǎn)擊每個(gè)按鈕切換可以分別設(shè)置 status,然后在 QML 中查看打印信息,看是否為我們想要的結(jié)果。
代碼跑起來(lái):
輸出打印信息:
通過(guò)打印信息可以看到,當(dāng)前 status 已經(jīng)發(fā)生了變化。
以上是最基本的枚舉使用方法。
注意:枚舉值的名稱必須以大寫字母開頭,以便可以從QML訪問(wèn)。
2
定義枚舉時(shí),還有一種寫法,如下:
enum class Status{Ready,Loading,Finished};Q_ENUM(Status)就是在枚舉名前面加一個(gè)class,這叫枚舉類,枚舉類QML中注冊(cè)為范圍和非范圍屬性。該Ready值將在Message.Status.Ready和注冊(cè)Message.Ready。
所以如果這種寫法就可以直接在 QML 中通過(guò)Message.Status.Ready來(lái)調(diào)用了。
3
上面說(shuō)到的枚舉類的用途通常是,當(dāng)有多個(gè)枚舉定義時(shí),并每個(gè)枚舉值的名稱如果有重復(fù),如 A 枚舉中的值是 value1,value2,而枚舉 B 里面也包含value1,value2兩個(gè)值,這時(shí)候就需要用到枚舉類,要不然會(huì)報(bào)錯(cuò)。
定義為枚舉類后,如果直接通過(guò)類名獲取枚舉值,那么在后面定義的值將會(huì)替換前面定義的枚舉值。來(lái)看個(gè)示例:
#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) };這里定義了兩個(gè)枚舉,其枚舉成員的名稱是一樣的,這時(shí)候如果直接通過(guò)Message.Ready來(lái)引用,結(jié)果將為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)}} }輸出結(jié)果:
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結(jié)果很明顯,只有通過(guò)枚舉類的方式來(lái)調(diào)用才能得到正確的值。
4
若想在 QML 中定義信號(hào),并且信號(hào)是帶枚舉類型參數(shù)的,那么定義信號(hào)的參數(shù)可以直接寫成 int 類型,如下
Message{id:msgsignal sigSendStatus(int status)Component.onCompleted: {sigSendStatus(Message.Ready)}}OK,關(guān)于 QML 中使用 C++定義的枚舉類型介紹就到這里。
上述的兩份源碼在這里
總結(jié)
以上是生活随笔為你收集整理的QML和C ++之间的数据类型转换---枚举的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2019开篇~
- 下一篇: QML UI 与逻辑分开