2017-03-16 23 views
-1

我在使用Qt 5.7.0和QML麻煩。我需要在運行時發現一些對象的屬性。的Qt/QML無法做出getOwnPropertyDescriptor工作

的目標是用在別處找到了一個純QML樹視圖。這個是用硬編碼的屬性構建的,以保存要顯示的值。這是一個非常簡單的樹視圖,它正是我需要的。使用控件2.0我沒有「股票」TreeView。

我的目標是改變純粹的QML TreeView,給他對象樹和特權名稱而不是硬編碼的名稱。

我不想使用一個完整的Qt模型有一個輕量級組件。

離開這個目標appart有時可以動態地請求一個屬性值,只知道它在運行時的名稱。例如,在C#和Java中,使用反射很容易實現。

從C#世界即將我在尋找同一個概念。在我的用例中,對象不是純粹的QML,而是由qmlRegisterType公開的C++。

我打算使用Object.getOwnPropertyDescriptor,但我不能讓它工作,因爲我想,測試小時後...

這裏是純QML/JS

import QtQuick 2.0 

Item { 

    id: myTest 

    property int myProp : 1234 


    function test() { 
     console.log("_________________TEST_________________"); 
     console.log(Object.getOwnPropertyNames(myTest)) 
     console.log(myTest.hasOwnProperty("myProp")) 
     console.log(Object.getOwnPropertyDescriptor(myTest, "myProp")); 
     console.log("_________________TEST_________________"); 
    } 
} 
一個POC

在日誌中我得到:

​​

據行「QML:真」的「hasOwnProperty(‘myProp’)」找物業,說「真」。

但下一行試圖獲得屬性描述符返回「不確定」。

誰可以解決我的問題將是我的英雄之一!

+0

所以屬性沒有被定義爲'readonly'嗎?一個簡短的片段,我需要想象「TreeView」的結構會很好。只要'hardcoded'不是'readonly'(在C++:沒有設置器)應該是可行的。 – derM

回答

0

如果你想要得到的屬性描述符,你需要之前設置它。

Item { 
    id: myTest 
    property int myProp : 1234 

    function test() { 
     console.log("_________________TEST_________________"); 
     console.log(Object.getOwnPropertyNames(myTest)) 
     console.log(myTest.hasOwnProperty("myProp")) 
     console.log(Object.getOwnPropertyDescriptor(myTest, "myProp")); 
     console.log(Object.getOwnPropertyDescriptor(myTest, "myProp").value) 
     console.log(myProp) 
     console.log("_________________TEST_________________"); 
    } 

    Component.onCompleted: { 
     Object.defineProperty(myTest, 'myProp', 
           { 
            enumerable: false, 
            configurable: false, 
            writable: false, 
            value: '50' 
           }) 
     test() 
    } 
} 

但恕我直言,這是完全沒用的。因此,也許這將是很好到您的最終目標擴大,因爲這個問題的你是最有可能的那些infamous XY-Questions

+0

好吧,我猜的屬性定義已經創建了一個描述符。我添加了關於最終目標的詳細信息 –

+0

我在JSFiddle中做了一個測試,因此在純Javascript中,並且它按照我猜測的工作。看來QML/JS沒有定義屬性或類似的東西。 –

0

覺得自己像一個小白一個...我發現我可以通過查詢名稱的屬性與MyObj中[propertyName的]語法。

之前很容易看到...