Qt / QML无法使getOwnPropertyDescriptor正常工作

时间:2017-03-16 17:25:51

标签: javascript qt qml

我在使用Qt 5.7.0和QML时遇到了麻烦。我需要在运行时发现一些对象的属性。

目标是使用其他地方找到的纯QML树视图。这个是使用硬编码属性构建的,用于保存要显示的值。这是一个非常简单的树视图,它正是我需要的。使用Controls 2.0我没有“库存”TreeView。

我的目标是更改纯QML TreeView,为其提供对象树和proprty名称,而不是硬编码名称。

我不想使用完整的Qt模型来拥有轻量级组件。

离开该目标可能有时必须动态询问属性值,只知道它在运行时的名称。例如,在C#和Java中,很容易使用反射来做到这一点。

来自C#世界我正在寻找相同的概念。在我的用例中,对象不是纯QML,而是由qmlRegisterType公开的C ++。

我计划使用 Object.getOwnPropertyDescriptor ,但经过数小时的测试后,我无法让它按照我的意愿运作......

这是纯QML / JS中的POC

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_________________");
   }
}

在日志中我得到:

qml: _________________TEST_________________
qml: [objectName,parent,data,resources,children,x,y,z,width,height,opacity,enabled,visible,visibleChildren,states,transitions,state,childrenRect,anchors,left,right,horizontalCenter,top,bottom,verticalCenter,baseline,baselineOffset,clip,focus,activeFocus,activeFocusOnTab,rotation,scale,transformOrigin,transformOriginPoint,transform,smooth,antialiasing,implicitWidth,implicitHeight,layer,myProp,objectNameChanged,childrenRectChanged,baselineOffsetChanged,stateChanged,focusChanged,activeFocusChanged,activeFocusOnTabChanged,parentChanged,transformOriginChanged,smoothChanged,antialiasingChanged,clipChanged,windowChanged,childrenChanged,opacityChanged,enabledChanged,visibleChanged,visibleChildrenChanged,rotationChanged,scaleChanged,xChanged,yChanged,widthChanged,heightChanged,zChanged,implicitWidthChanged,implicitHeightChanged,update,grabToImage,grabToImage,contains,mapToGlobal,mapFromGlobal,mapFromItem,mapToItem,forceActiveFocus,forceActiveFocus,nextItemInFocusChain,nextItemInFocusChain,childAt,myPropChanged,test]
qml: true
qml: undefined
qml: _________________TEST_________________

根据“qml:true”行,“hasOwnProperty('myProp')”找到属性并说“true”。

但是试图获取属性描述符的下一行返回“undefined”。

能解决我问题的人将是我的英雄!

2 个答案:

答案 0 :(得分:1)

感觉像个菜鸟...我发现我可以使用 myobj [propertyName] 语法按名称查询属性。

之前很容易被人看到......

答案 1 :(得分: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