深入解析QML引擎, 第4部分: 自定义解析器
原文?QML Engine Internals, Part 4: Custom Parsers
———————————————————————————————————————————
上一篇 綁定類型
簡要回顧
圖1 QML例子 Q_PROPERTYs無處不在?
讓我們稍微擴展一下這個例子,當鼠標點擊時,將矩形變紅:
圖2 擴展例子 自定義解析器
仔細閱讀QQuickPropertyChanges類的頭文件,我們找到了一點破解顏色屬性秘密的線索:在文件末尾還有另一個類:QQuickPropertyChangesParser,它繼承于QQmlCustomParser。
想要了解自定義解析器到底是如何工作的,我們得先回顧一下QML文件的加載,在第一篇博文中就已經(jīng)講解了,QML文件的加載分為兩個階段:
1.編譯階段
QML文件會被解析和編譯一次,最后會創(chuàng)建一個包含指令列表的QQmlCompiledData對象。除指令列表外,它還包含了一些補充這些指令的二進制數(shù)據(jù)。閱讀之前的博文可以看到這些指令是什么樣子的。
2.生成階段
當QML文件被實例化后,QML引擎就會在QQmlCompiledData對象中查找指令,并在虛擬機中執(zhí)行它們。
自定義解析器在編譯和生成階段都會被調用:
1.在編譯階段,QQmlCustomParser::compile()將被調用
下面的一點調試代碼證實了顏色屬性是被傳遞到了自定義解析器中:
圖3 ?證實屬性的調試代碼輸出:
圖4 調試代碼輸出結果就PropertyChanges的自定義解析器而言,它只是簡單地將參數(shù)按原樣序列化存入QByteArray。
2.在生成階段,QQuickPropertyChangesParser::setCustomData()將被調用
在我們這個例子中,PropertyChanges的自定義解析器只是簡單地把數(shù)據(jù)傳遞給QQuickPropertyChanges對象。稍后,由QQuickPropertyChangesPrivate::decode()對這些數(shù)據(jù)做一些處理:對數(shù)據(jù)進行反序列化。然后創(chuàng)建一個ExpressionChange對象列表。當屬性改變時,這些ExpressionChange就會被執(zhí)行。
因為QQmlCustomParser是私有的API,所以編寫自己的自定義解析器并不是那么簡單。
總結
為了支持QML元素中的任意屬性,除了使用正常的Q_PROPERTYs,還需要使用自定義解析器。這些自定義解析器獲得所有未知屬性的列表后,可以對這些屬性做任何處理。QML文件的加載過程中,存在編譯和生成兩個階段。在編譯階段,自定義解析器創(chuàng)建一個存儲二進制數(shù)據(jù)QByteArray,它存儲所有在生成階段需要的信息。在生成階段,這個QByteArray被傳遞給了自定義解析器,這時自定義解析器才真正意義上地使用這些數(shù)據(jù)。
討論
PropertyChanges元素具有自定義分析器是相當方便的,僅列出color: "red"就相當不錯了。更妙的是,你可以很輕松地列出多個屬性:
圖5 多屬性例子與之形成對比的是,使用稍微丑陋一點語法的PropertyAction:
圖6 PropertyAction這里存在一個不一致的地方:在一種情況下,能夠使用優(yōu)美的語法,在其他情況下,則不能。在我看來是相當混亂的,特別是在你不了解自定義解析器的情況下。
另一個例子是ListElement元素,它同樣具有一個自定義解析器。因為它的屬性是由自定義解析器解析的,它們表現(xiàn)得不太像正常屬性。就我個人而言,我偶然發(fā)現(xiàn)了它們的奇怪行為,比如QTBUG-16289。
最后一個使用自定義解析器的例子是Connections元素,當連接到一個從C++里導出的對象的信號時,這是非常有用的:
圖7 Connections你是怎么看待自定義解析器存在的意義的?
至此,4篇文章全部翻譯結束了,如果有什么疑問或者對QML應用和研究感興趣的朋友,歡迎加入我們進行討論(QQ群:280689979)。如需轉載,無須我們授權,但需要注明原文鏈接(該文的鏈接),及原作者,謝謝!
上一篇 綁定類型
作者:猿基地
鏈接:https://www.jianshu.com/p/070f1d94071b
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯(lián)系作者獲得授權并注明出處。
轉載于:https://www.cnblogs.com/wzxNote/p/10569554.html
總結
以上是生活随笔為你收集整理的深入解析QML引擎, 第4部分: 自定义解析器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 介绍Dynamics 365的OrgDB
- 下一篇: [HNOI2010]公交线路