QML和C ++之间的数据类型转换---枚举
前言
眾所周知,如果要在 QML使用 C++中定義的類型,有些數(shù)據類型是是可以直接使用的,如常見的 int,但是還有一些相對特殊的類型就需要做些特定的操作才可以使用了,那么,這里來看一下如何在 QML 中使用 C++中定義的枚舉類型。
正文
1
要將自定義枚舉用作數(shù)據類型,必須注冊其類,并且還必須使用Q_ENUM()聲明枚舉,以將其注冊到Qt的元對象系統(tǒng)。
話不多說,直接上代碼:
首先我們定義一個類,繼承于 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 中查看打印信息,看是否為我們想要的結果。
代碼跑起來:
輸出打印信息:
通過打印信息可以看到,當前 status 已經發(fā)生了變化。
以上是最基本的枚舉使用方法。
注意:枚舉值的名稱必須以大寫字母開頭,以便可以從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 中定義信號,并且信號是帶枚舉類型參數(shù)的,那么定義信號的參數(shù)可以直接寫成 int 類型,如下
Message{id:msgsignal sigSendStatus(int status)Component.onCompleted: {sigSendStatus(Message.Ready)}}OK,關于 QML 中使用 C++定義的枚舉類型介紹就到這里。
上述的兩份源碼在這里
總結
以上是生活随笔為你收集整理的QML和C ++之间的数据类型转换---枚举的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019开篇~
- 下一篇: QML UI 与逻辑分开