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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

深入解析QML引擎, 第4部分: 自定义解析器

發(fā)布時間:2024/4/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入解析QML引擎, 第4部分: 自定义解析器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文?QML Engine Internals, Part 4: Custom Parsers

———————————————————————————————————————————

上一篇 綁定類型

簡要回顧

圖1 QML例子

Q_PROPERTYs無處不在?

讓我們稍微擴展一下這個例子,當鼠標點擊時,將矩形變紅:

圖2 擴展例子

自定義解析器

仔細閱讀QQuickPropertyChanges類的頭文件,我們找到了一點破解顏色屬性秘密的線索:在文件末尾還有另一個類:QQuickPropertyChangesParser,它繼承于QQmlCustomParser。

想要了解自定義解析器到底是如何工作的,我們得先回顧一下QML文件的加載,在第一篇博文中就已經講解了,QML文件的加載分為兩個階段:

1.編譯階段

QML文件會被解析和編譯一次,最后會創(chuàng)建一個包含指令列表的QQmlCompiledData對象。除指令列表外,它還包含了一些補充這些指令的二進制數據。閱讀之前的博文可以看到這些指令是什么樣子的。

2.生成階段

當QML文件被實例化后,QML引擎就會在QQmlCompiledData對象中查找指令,并在虛擬機中執(zhí)行它們。

自定義解析器在編譯和生成階段都會被調用:

1.在編譯階段,QQmlCustomParser::compile()將被調用

下面的一點調試代碼證實了顏色屬性是被傳遞到了自定義解析器中:

圖3 ?證實屬性的調試代碼

輸出:

圖4 調試代碼輸出結果

就PropertyChanges的自定義解析器而言,它只是簡單地將參數按原樣序列化存入QByteArray。

2.在生成階段,QQuickPropertyChangesParser::setCustomData()將被調用

在我們這個例子中,PropertyChanges的自定義解析器只是簡單地把數據傳遞給QQuickPropertyChanges對象。稍后,由QQuickPropertyChangesPrivate::decode()對這些數據做一些處理:對數據進行反序列化。然后創(chuàng)建一個ExpressionChange對象列表。當屬性改變時,這些ExpressionChange就會被執(zhí)行。

因為QQmlCustomParser是私有的API,所以編寫自己的自定義解析器并不是那么簡單。

總結

為了支持QML元素中的任意屬性,除了使用正常的Q_PROPERTYs,還需要使用自定義解析器。這些自定義解析器獲得所有未知屬性的列表后,可以對這些屬性做任何處理。QML文件的加載過程中,存在編譯和生成兩個階段。在編譯階段,自定義解析器創(chuàng)建一個存儲二進制數據QByteArray,它存儲所有在生成階段需要的信息。在生成階段,這個QByteArray被傳遞給了自定義解析器,這時自定義解析器才真正意義上地使用這些數據。

討論

PropertyChanges元素具有自定義分析器是相當方便的,僅列出color: "red"就相當不錯了。更妙的是,你可以很輕松地列出多個屬性:

圖5 多屬性例子

與之形成對比的是,使用稍微丑陋一點語法的PropertyAction:

圖6 PropertyAction

這里存在一個不一致的地方:在一種情況下,能夠使用優(yōu)美的語法,在其他情況下,則不能。在我看來是相當混亂的,特別是在你不了解自定義解析器的情況下。

另一個例子是ListElement元素,它同樣具有一個自定義解析器。因為它的屬性是由自定義解析器解析的,它們表現得不太像正常屬性。就我個人而言,我偶然發(fā)現了它們的奇怪行為,比如QTBUG-16289。

最后一個使用自定義解析器的例子是Connections元素,當連接到一個從C++里導出的對象的信號時,這是非常有用的:

圖7 Connections

你是怎么看待自定義解析器存在的意義的?

至此,4篇文章全部翻譯結束了,如果有什么疑問或者對QML應用和研究感興趣的朋友,歡迎加入我們進行討論(QQ群:280689979)。如需轉載,無須我們授權,但需要注明原文鏈接(該文的鏈接),及原作者,謝謝!

上一篇 綁定類型



作者:猿基地
鏈接:https://www.jianshu.com/p/070f1d94071b
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。

轉載于:https://www.cnblogs.com/wzxNote/p/10569554.html

總結

以上是生活随笔為你收集整理的深入解析QML引擎, 第4部分: 自定义解析器的全部內容,希望文章能夠幫你解決所遇到的問題。

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