综合亚洲自拍_...av二区三区久久精品_日本暖暖在线视频_强乱中文字幕av一区乱码_精品一区二区三区毛片_www.日韩免费_97国产精品videossex_中文字幕一区二区三区日韩精品_精品国产精品国产精品_91黄色8090

您的位置:首頁 > 基金 > 正文

世界熱議:將 C++ 類型的屬性暴露給 QML

2023-06-28 22:26:24 來源:QT教程

可以使用 C++ 代碼中定義的功能輕松擴展 QML。由于 QML 引擎與 Qt 元對象系統的緊密集成,QObject 派生類公開的任何功能都可以從 QML 代碼訪問。這使得 C++ 數據和函數可以直接從 QML 訪問,通常幾乎不需要修改。


(資料圖)

QML 引擎能夠通過元對象系統反射 QObject 實例。這意味著任何 QML 代碼都可以訪問 QObject 派生類的實例的以下成員:

屬性 方法(前提是它們是 public slots 或用 Q_INVOKABLE 標記) 信號

(此外,如果枚舉是用 Q_ENUMS 聲明的,則也可以訪問)

一、數據類型處理和所有權

任何從 C++ 傳輸到 QML 的數據,無論是作為屬性值、方法參數或返回值,還是信號參數值,都必須是 QML 引擎支持的類型。

默認情況下,引擎支持許多 Qt C++ 類型,并且可以在從 QML 使用時自動適當地轉換它們。

1.1、暴露屬性

可以使用 Q_PROPERTY() 宏為任何 QObject 派生類指定屬性。

例如,下面是一個具有作者屬性的 Message 類。 正如 Q_PROPERTY 宏調用所指定的,這個屬性可以通過 author() 方法讀取,通過 setAuthor() 方法寫入:

注意:不要使用 typedef 或 using 指定 Q_PROPERTY 類型,因為它們會混淆 moc。 這可能會使某些類型比較失敗。

錯誤用法:

using FooEnum = Foo::Enum;class Bar : public QObject{Q_OBJECTQ_PROPERTY(FooEnum enum READ enum WRITE setEnum NOTIFY enumChanged)};

正確用法:

class Bar : public QObject{Q_OBJECTQ_PROPERTY(Foo::Enum enum READ enum WRITE setEnum NOTIFY enumChanged)};

暴露屬性實例:

class Message : public QObject{Q_OBJECTQ_PROPERTY(QString author READ author WRITE setAuthor NOTIFY authorChanged)public:void setAuthor(const QString &a){if (a != m_author){m_author = a;emit authorChanged();}}QString author() const{return m_author;}signals:void authorChanged();private:QString m_author;};

如果在從 C++ 加載名為 MyItem.qml 的文件時將此類的實例設置為上下文屬性:

int main(int argc, char *argv[]){QGuiApplication app(argc, argv);QQuickView view;Message msg;view.engine()->rootContext()->setContextProperty(\"msg\", &msg);view.setSource(QUrl::fromLocalFile(\"MyItem.qml\"));view.show();return app.exec();}

然后,可以從 MyItem.qml 中讀取 author 屬性:

// MyItem.qmlimport QtQuick 2.0Text{width: 100; height: 100text: msg.author // 調用 Message::author() 來獲取這個值Component.onCompleted:{msg.author = \"Jonah\" // 調用 Message::setAuthor()}}

為了實現C++與 QML 的最大互操作性,任何可寫的屬性都應該有一個關聯的 NOTIFY 信號,該信號在屬性值更改時發出。這允許屬性與屬性綁定一起使用,這是 QML 的一個基本特性,它通過在任何依賴項的值發生變化時自動更新屬性來強制執行屬性之間的關系。即發出信號會通知 QML 引擎更新任何涉及屬性的綁定。

【領 QT開發教程 學習資料, 點擊下方鏈接莬費領取↓↓ ,先碼住不迷路~】

點擊這里:

上面示例中如果 author 屬性可寫但沒有關聯的 NOTIFY 信號,則文本值將使用 Message::author() 返回的初始值進行初始化,但不會隨此屬性的任何后續更改而更新。此外,任何從 QML 綁定到屬性的嘗試都會從引擎產生運行時警告。

建議將 NOTIFY 信號命名為 Changed,其中 是屬性的名稱。QML 引擎生成的關聯屬性更改信號處理程序將始終采用 onChanged 形式,無論相關 C++ 信號的名稱如何,因此建議信號名稱遵循此約定以避免任何混淆。

1.2、使用通知信號的注意事項

開發人員應確保僅在屬性值實際更改時才發出屬性更改信號。此外,如果一個屬性或一組屬性不經常使用,則允許對多個屬性使用相同的 NOTIFY 信號。這應該小心完成以確保性能不會受到影響。

NOTIFY 信號的存在確實會產生很小的開銷。在某些情況下,屬性的值是在對象構造時設置的,隨后不會更改。在這些情況下,可以將 CONSTANT 屬性而不是 NOTIFY 信號添加到屬性聲明中。

CONSTANT 屬性應僅用于其值僅在類構造函數中設置和最終確定的屬性。

Qt屬性系統。

1.3、具有對象類型的屬性

對象類型屬性可從 QML 訪問,前提是對象類型已正確注冊到 QML 類型系統。

例如,Message 類型可能具有 MessageBody* 類型的 body 屬性:

class Message : public QObject{Q_OBJECTQ_PROPERTY(MessageBody* body READ body WRITE setBody NOTIFY bodyChanged)public:MessageBody* body() const;void setBody(MessageBody* body);};class MessageBody : public QObject{Q_OBJECTQ_PROPERTY(QString text READ text WRITE text NOTIFY textChanged)// ...}假設 Message 類型已在 QML 類型系統中注冊,允許將其用作 QML 代碼中的對象類型:Message{// ...}

如果 MessageBody 類型也注冊到類型系統,則可以將 MessageBody 分配給 Message 的 body 屬性:

Message{body: MessageBody{text: \"Hello, world!\"}}

1.4、具有對象列表類型的屬性

包含 QObject 派生類型列表的屬性也可以暴露給 QML。然而,應該使用 QQmlListProperty 而不是 QList作為屬性類型。 這是因為 QList 不是 QObject 派生的類型,因此無法通過 Qt 元對象系統提供必要的 QML 屬性特征,例如修改列表時的信號通知。

例如,下面的 MessageBoard 類有一個 QQmlListProperty 類型的消息屬性,用于存儲 Message 實例列表:

class MessageBoard : public QObject{Q_OBJECTQ_PROPERTY(QQmlListPropertymessages READ messages)public:QQmlListPropertymessages(){return QQmlListProperty(this, 0, &MessageBoard::append_message);}private:static void append_message(QQmlListProperty*list, Message *msg){MessageBoard *msgBoard = qobject_cast(list->object);if (msg)msgBoard->m_messages.append(msg);}QListm_messages;};

QQmlListProperty 的模板類類型(在本例中為 Message)必須在 QML 類型系統中注冊。

1.5、分組屬性

任何只讀的對象類型屬性都可以作為分組屬性從 QML 代碼訪問。這可用于公開一組相關屬性,這些屬性描述了類型的一組屬性。

例如,假設 Message::author 屬性的類型是 MessageAuthor 而不是簡單的字符串,具有 name 和 email 的子屬性:

class MessageAuthor : public QObject{Q_PROPERTY(QString name READ name WRITE setName)Q_PROPERTY(QString email READ email WRITE setEmail)public:...};class Message : public QObject{Q_OBJECTQ_PROPERTY(MessageAuthor* author READ author)public:Message(QObject *parent): QObject(parent), m_author(new MessageAuthor(this)){}MessageAuthor *author() const{return m_author;}private:MessageAuthor *m_author;};

可以使用 QML 中的分組屬性語法編寫 author 屬性:

Message{author.name: \"Alexandra\"author.email: \"alexandra@mail.com\"}

分組屬性是只讀的,并且在構造時由父對象初始化為有效值。

分組屬性的子屬性可以從 QML 修改,但分組屬性對象本身永遠不會改變,

二、暴露方法

QObject 派生類型的任何方法都可以從 QML 代碼訪問,只要它滿足其中一項:

用 Q_INVOKABLE() 宏標記的公共方法

作為 public slot 的方法

例如,下面的 MessageBoard 類有一個使用 Q_INVOKABLE 宏標記的 postMessage() 方法,以及一個公共槽的 refresh() 方法:

class MessageBoard : public QObject{Q_OBJECTpublic:Q_INVOKABLE bool postMessage(const QString &msg){qDebug() << \"Called the C++ method with\" << msg;return true;}public slots:void refresh(){qDebug() << \"Called the C++ slot\";}};

如果將 MessageBoard 的實例設置為文件 MyItem.qml 的上下文數據,則 MyItem.qml 可以調用兩個方法,如下例所示:

int main(int argc, char *argv[]){QGuiApplication app(argc, argv);MessageBoard msgBoard;QQuickView view;view.engine()->rootContext()->setContextProperty(\"msgBoard\", &msgBoard);view.setSource(QUrl::fromLocalFile(\"MyItem.qml\"));view.show();return app.exec();}// MyItem.qmlimport QtQuick 2.0Item{width: 100; height: 100MouseArea{anchors.fill: parentonClicked:{var result = msgBoard.postMessage(\"Hello from QML\")console.log(\"Result of postMessage():\", result)msgBoard.refresh();}}}

如果 C++ 方法具有 QObject* 類型的參數,則可以使用對象 id 或引用該對象的 JavaScript 變量值從 QML 傳遞參數值。

QML 支持調用重載的 C++ 函數。 如果存在多個同名但參數不同的 C++ 函數,則會根據提供的參數數量和類型調用正確的函數。

當從 QML 中的 JavaScript 表達式訪問時,從 C++ 方法返回的值將轉換為 JavaScript 值。

三、暴露信號

QObject 派生類型的任何公共信號都可以從 QML 代碼訪問。

QML 引擎自動為從 QML 使用的 QObject 派生類型的任何信號創建信號處理程序。信號處理程序始終命名為 on,其中 是信號的名稱,首字母大寫。 信號傳遞的所有參數都可以通過參數名稱在信號處理程序中使用。

例如,假設 MessageBoard 類有一個帶有單個參數主題的 newMessagePosted() 信號:

class MessageBoard : public QObject{Q_OBJECTpublic:// ...signals:void newMessagePosted(const QString &subject);};

如果 MessageBoard 類型已注冊到 QML 類型系統,則在 QML 中聲明的 MessageBoard 對象可以使用名為 onNewMessagePosted 的信號處理程序接收 newMessagePosted() 信號,并檢查主題參數值:

MessageBoard{onNewMessagePosted: (subject)=>console.log(\"New message received:\", subject)}

與屬性值和方法參數一樣,信號參數必須具有 QML 引擎支持的類型。(使用未注冊的類型不會產生錯誤,但處理程序將無法訪問參數值。)

請注意,QML引擎無法區分名稱相同但參數不同的信號,類可能有多個同名的信號,但只有最后一個信號可以作為 QML 信號訪問。

【領 QT開發教程 學習資料, 點擊下方鏈接莬費領取↓↓ ,先碼住不迷路~】

點擊這里:

標簽:

相關閱讀

大家愛看

環球消息!6月28日漲停分析 環球消息!6月28日漲停分析

【6月28日漲停分析】今日共33股漲停,連板股總數7只,12股封板未遂,封

最近更新

久久三级毛片| 欧美色综合影院| av网站免费线看精品| 蜜桃一区二区三区在线观看| 中文字幕一区二区三区乱码图片| 一本久久青青| 老司机精品在线| 日韩精品一区二区三区中文 | 国产精品99久久免费观看| 中文在线а√天堂| 国产偷倩在线播放| 国产原厂视频在线观看| 97在线观看免费观看高清| 亚洲欧美日本免费| 在线观看h视频| 中文字幕欧美国内| 精品日韩99亚洲| 欧美日韩一区三区| 欧美三片在线视频观看| 在线观看91精品国产入口| 一本久久a久久精品亚洲| 午夜久久久影院| 亚洲二区在线观看| 欧美日韩国产影院| 欧美亚洲精品一区| 欧美日韩精品二区第二页| 欧美视频精品在线| 欧美丰满嫩嫩电影| 欧美成人video| 欧美精品一区二区三区久久久| 欧美哺乳videos| 亚洲国产精品va在线看黑人| 日韩国产高清污视频在线观看| 精品丝袜一区二区三区| 亚洲午夜未删减在线观看 | 国产精品xxxxxx| 免费无码国产精品| 国产精品一区二区免费视频| av av片在线看| 天天干天天草天天射| 最新天堂资源在线资源| 国产福利第一视频在线播放| 欧美成人视屏| 亚洲欧美小说色综合小说一区| 成人黄色毛片| 黄色欧美网站| 久久视频在线| 欧美亚洲网站| 成人综合婷婷国产精品久久免费| 国产亚洲一区二区在线观看| 亚洲欧美日本韩国| 日本精品一级二级| 亚洲精品在线一区二区| 日韩视频免费大全中文字幕| 97人人模人人爽人人喊中文字| 国产va免费精品高清在线观看| 亚洲一区二区久久久久久久| 欧美精品久久久| 麻豆传媒网站在线观看| 国产激情在线观看视频| 亚洲午夜久久久久久久久| 91视频免费在观看| 欧美亚洲精品天堂| 欧美自拍偷拍第一页| 成人在线免费公开观看视频| 高清精品在线| jizz国产精品| 黄色精品免费| 国产69精品一区二区亚洲孕妇| 国产精品无码永久免费888| 黑人狂躁日本妞一区二区三区 | 精品日韩成人av| 久久成人精品电影| 91亚洲精品在线| 在线成人性视频| 黄色片视频在线| 一本在线免费视频| 欧美一区永久视频免费观看| 一区二区在线影院| 日韩电影免费在线观看网站| 99久久精品国产导航| 可以在线观看的av| av片在线免费观看| 日韩经典一区| 99成人在线视频| 免费人成在线不卡| 久久久国产精华| 在线视频国内自拍亚洲视频| 亚洲深夜福利视频| 国产精品视频免费在线| 亚洲精品无人区| 涩多多在线观看| 国产极品国产极品| 国产后入清纯学生妹| 免费黄色网址在线观看| 精品久久国产一区| 亚洲国产二区| 国产网红主播福利一区二区| 在线免费一区三区| 久久不射电影网| 久久久婷婷一区二区三区不卡| 午夜肉伦伦影院| 99成人在线观看| 欧美一区二区黄片| 中文字幕21页在线看| 日本成人小视频| 国产成人日日夜夜| 日本韩国欧美在线| 欧美激情第99页| 神马一区二区影院| 亚洲精品久久一区二区三区777| 偷偷操不一样的久久| 电影av一区| 97一区二区国产好的精华液| 视频一区欧美精品| 亚洲综合免费观看高清完整版在线| 亚洲精品国产福利| 91精品视频在线看| 久草综合在线观看| 久久夜色精品亚洲| yw在线观看| 日韩精品欧美大片| 国产在线不卡一区| 欧美视频在线播放| 国产91精品久久久久久久| 欧美 另类 交| 中文国语毛片高清视频| 亚洲福利二区| 国产精品2023| 国产.欧美.日韩| 56国语精品自产拍在线观看| 国产精品极品尤物在线观看| 97成人在线观看视频| 久久免费公开视频| 午夜在线a亚洲v天堂网2018| 欧美日韩国产色综合一二三四| 久久综合久色欧美综合狠狠| 欧美一级免费大片| 成人欧美一区二区三区在线湿哒哒| 亚洲熟妇av一区二区三区漫画| 欧美交换国产一区内射| 99riav在线| 欧美色网址大全| 亚洲国产成人午夜在线一区| 国产一区二区三区在线视频| 美女一区视频| 极品粉嫩小仙女高潮喷水久久| 欧美熟妇交换久久久久久分类| 精品美女一区| 精品综合久久久久久8888| 欧美日韩三级一区| 国产在线观看一区二区三区 | 欧美高清一级片在线| 国产精品日韩在线观看| 手机av在线网| av av片在线看| 久久久久九九精品影院| 成人自拍视频在线| 亚洲性无码av在线| 中文字幕久久综合| 玖玖爱免费视频| 啦啦啦中文在线观看日本| 精品9999| 欧美视频一二三区| 99精彩视频| 人妻精品久久久久中文字幕| 青青草观看免费视频在线| jlzzjlzz亚洲女人| 天天爽天天狠久久久| 国产免费毛卡片| 天天操中文字幕| 擼擼色在线看观看免费| 免费在线看成人av| 日韩免费高清av| 裸模一区二区三区免费| 老司机精品免费视频| 免费观看久久久久| 亚洲激情网站| 欧美日韩国产123区| 国产亚洲精品美女久久久m| 97在线观看免费视频| av男人的天堂在线| 亚洲日韩视频| 欧美一区二区免费视频| 欧美精品亚洲精品| 国产亚洲第一页| 激情亚洲影院在线观看| 国产99久久久久| 日韩小视频在线| 激情深爱综合网| 国产成人精品一区二三区四区五区| 在线播放一区二区精品视频| 欧美精彩视频一区二区三区| 777国产偷窥盗摄精品视频| 欧美丝袜在线观看| 一级片免费在线| 激情久久一区| 欧美一级搡bbbb搡bbbb| 亚洲视频电影| 成人一级免费视频| 欧美精品中文| 亚洲一二三区视频在线观看| 成人女保姆的销魂服务| 一二三四国产精品| 黄视频网站在线观看| 成人亚洲一区二区一| 久久午夜a级毛片| 成人一区二区三| 成人动漫av| 在线观看视频免费一区二区三区| 欧美mv日韩mv国产| 97在线国产视频| 国产 日韩 欧美 精品| 97精品视频在线看| 5566中文字幕一区二区电影| 中文字幕中文字幕一区三区| 中文字幕一区二区三区四区免费看 | 国产福利视频在线| 久久国产夜色精品鲁鲁99| 色偷偷888欧美精品久久久| 亚洲欧美自拍另类日韩| 丁香婷婷在线| 国内国产精品久久| 欧美—级a级欧美特级ar全黄| 小毛片在线观看| av资源中文在线| 国产丝袜在线精品| 成人黄色免费片| 久久精品国产亚洲av麻豆色欲| 国产高清视频一区二区| 一区二区三区蜜桃| 欧美日韩成人一区二区三区| 亚洲一区 中文字幕| 午夜精品视频一区二区三区在线看| 51精品国自产在线| 日韩激情免费视频| 国产爆初菊在线观看免费视频网站| 免费精品视频在线| 欧美黑人一级爽快片淫片高清| 日韩一级视频在线观看| 国产韩日精品| 午夜欧美在线一二页| 三区精品视频观看| 欧美一区二区三区黄片 | 91av视频在线| 少妇精品无码一区二区免费视频| 欧美韩国亚洲| 亚洲成a天堂v人片| 亚洲欧美精品在线观看| 男人天堂av网| 日韩专区一卡二卡| 97视频在线观看亚洲| a一级免费视频| 秋霞在线一区| 日韩精品一区二区三区中文精品| 亚欧在线免费观看| 欧美videosex性欧美黑吊| 国产精品进线69影院| 免费看成人午夜电影| 黄色成人一级片| 久久精品99国产国产精| 国产精品99久久99久久久二8| 久久精品国产亚洲av无码娇色| 精品国产精品国产偷麻豆| 亚洲福利视频网| 精品国产aⅴ一区二区三区东京热| 天堂av在线网| 欧美日韩亚洲一区二| xxxx18hd亚洲hd捆绑| 一级毛片视频在线| 国产欧美一区二区精品忘忧草| 激情久久av| 色香蕉在线视频| 国产精品自拍一区| 成人高清视频观看www| 999视频在线观看| 中文字幕+乱码+中文乱码www | 国产精品视频自在线| 久久精品国产亚洲AV无码麻豆| 久久中文亚洲字幕| 精品国产一区二区三区四区在线观看 | 精品麻豆一区二区三区| 国产清纯白嫩初高生在线观看91| 欧美福利一区二区三区| 伊人春色在线| 91丨porny丨中文| 日本亚洲自拍| 日本视频在线观看一区二区三区| 99久久精品免费精品国产| 久久人人九九| 你懂得在线网址| 国产午夜精品久久久久久免费视| 国产亚洲精品美女久久久m| 一级片黄色免费| 国内自拍亚洲| 欧美一级日韩一级| 亚洲一区二区三区四区av| 成人在线啊v| 亚洲国产精品人久久电影| 女人被狂躁c到高潮| 久久亚州av| 中文字幕成人精品久久不卡| 日韩黄色免费观看| 欧美日韩精品| 日韩av免费一区| 99热这里只有精品在线观看| 国产九色精品成人porny| 久99久在线| 成人av毛片| 亚洲成人免费视频| 亚洲一区在线不卡| 欧美1区2区3| 亚洲男人av电影| 欧美片一区二区| 性一交一乱一区二区洋洋av| 91久久精品美女| 在线成年人视频| 亚洲欧洲日韩av| 免费观看成人在线视频| 日韩亚洲国产免费| 亚洲免费福利视频| 久久久久久天堂| 日韩国产欧美视频| 久久亚裔精品欧美| 在线观看av黄网站永久| 欧美性xxxxx极品| 最新版天堂资源在线| 日本a级不卡| 国产97在线观看| julia京香一区二区三区| 1024精品合集| 潘金莲激情呻吟欲求不满视频| 精品国产导航| 久操成人在线视频| aaa一区二区| 国产精品福利一区二区| 色多多视频在线播放| 乱亲女h秽乱长久久久| 欧美激情网友自拍| 亚洲国产一二三区| 中文字幕亚洲在| 999久久久精品视频| 国产日韩欧美一区二区三区| 浅井舞香一区二区| 91短视频在线观看| 亚洲高清免费观看 | 亚洲一区二区三区三州| 国产99亚洲| 国产成人午夜视频网址 | kk眼镜猥琐国模调教系列一区二区| a级黄色片网站| 国产精品xxx| 精品国产欧美一区二区三区成人| 波多野结衣视频网址| 国产在线精品一区二区夜色| 亚洲天堂av免费在线观看| 免费在线观看一区| 日韩中文视频免费在线观看| 在线观看免费高清视频| 国产午夜精品久久久久久免费视| 日本成人在线免费视频| 亚洲区小说区图片区qvod| 国产www精品| 国产一区精品| 91精品免费观看| 国产精品16p| 99re在线精品| 天堂一区在线观看| 伊人色**天天综合婷婷| 国产女主播一区二区| 漫画在线观看av| 日韩中文综合网| 日本精品一区二区在线观看| 亚洲国产精品一区二区久久 | 午夜精品一区二区三区在线观看 | 人与动物性xxxx| 精彩视频一区二区三区| 日韩精品 欧美| 奇米狠狠一区二区三区| 92看片淫黄大片欧美看国产片| 天堂av中文在线| 一区二区三区日韩在线| 性一交一乱一透一a级| 天天做天天摸天天爽国产一区 | 成人一区不卡| 国产精品国产亚洲精品看不卡15| 大菠萝精品导航| 久久久黄色av| 香蕉97视频观看在线观看| 69精品人人人人| 日本成人一级片| 亚洲成人精品在线观看| 久久r这里只有精品| 91老师国产黑色丝袜在线| 三上悠亚 电影| 丝袜美腿亚洲色图| 国产中文字幕在线免费观看| 99久久精品费精品国产| 日本一区高清不卡| 99久久香蕉|