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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

前言

眾所周知,如果要在 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 中查看打印信息,看是否為我們想要的結果。

代碼跑起來:

輸出打印信息:

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

通過打印信息可以看到,當前 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 ++之间的数据类型转换---枚举的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。