[英]Changing QML properties with compile-time safety from C++
是否可以通過編譯時安全性從C ++調用QML組件中的函數或更改屬性?
當前更改屬性的建議是使用以下任何功能:
QQmlProperty::write(object, "someNumber", 100);
QMetaProperty::write(object, "someNumber", 100)
object->setProperty("someNumber", 100);
其中object是QML組件的QObject *
,它具有名為someNumber
的屬性。 有關更多信息,請參考http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html 。
目前,即使沒有名為otherNumber
屬性,我也可以將"someNumber"
更改為"otherNumber"
而不會發生任何編譯錯誤。
甚至可以將數字100
更改為其他類型,例如"100"
(字符串文字),而不會發生任何編譯錯誤,即無需類型檢查。 當您嘗試從C ++調用QML組件中定義的函數時,也會發生類似的問題。
我知道,如果每個函數無法轉換類型或該屬性不存在,則每個函數都將返回false,但我正在尋找編譯時錯誤檢查。
有誰知道如何做到這一點?
這完全取決於object
的C ++類型
如果您有權訪問其聲明(標題),則可以直接轉換為具體類型並直接調用setter方法,而不必通過抽象屬性API。
但是,從C ++設置QML對象屬性通常不是一個好主意,因為您依賴於對象的存在並具有某種類型。
更好的方法是使數據作為屬性提供給您公開給QML的對象,並在QML方面處理分配。 這樣,暴露對象的API在C ++的控制下已滿,因此,您始終可以通過各自的類型檢查來調用setter。
由於Qt元對象系統依賴於QVariant,所以這是不可能的,因此傳遞給它的所有數據都將首先轉換為QVariant,然后僅在接收方轉換回QVariant。 對話是否失敗只能在運行時知道。
但是您可以創建一個C ++類,您將在其中修改C ++中的數據並將其導出到QML。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.