簡體   English   中英

從C ++更改具有編譯時安全性的QML屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM