日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/1/21 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QML和C ++之间的数据类型转换---枚举 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

眾所周知,如果要在 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):

輸出打印信息:

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

通過(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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。