Read of delegate objectName



  • Hello everybody,

    I have something like this:
    QML:

    ListView{
    id: listViewId
    objectName:"listViewObj"
    ....
    delegate: Rectangle {
    	id: rectnagleId
    	objectName: "rectangleDelegate"
    	....
    	}
    }
    

    and how can i get the property from the delegate?



  • We need more info to understand what do you want to do. But since delegate property is Component you cannot acces anything by id rectnagleId. This id is internal only for that rectangle.



  • I want to write a unittest for the QML file.
    I could access all objects using ObjectName and check the property.

    at delegate I can not use objectname and my question how can I access the property within this delegate?



  • As I said, in fact your delegate isn't exist like an any item. ListView will instantiate such items by demand, you can access only really existed items.



  • @intruderexcluder
    How can I then test the property of this delegate with Unittest?



  • Not sure, but if you want to test only objectName property you can create dummy component and then create object from this component. Get delegate property of your ListView and then create object via QQmlComponent or Qt.createComponent depends from which side you want to test your delegate. Hope this can help.



  • I really did not understand that exactly.
    can you please explain to me more exactly with an example?

    many thanks



  • In case of QML you can create Rectangle object directly from delegate property:

        ListView {
            id: view
            objectName: "listview"
            delegate: Rectangle { objectName: "delegaterect" }
        }
    
        Component.onCompleted: {
            let d = view.delegate.createObject(null);
            console.log(d.objectName);
            d.Component.destruction.connect(() => { console.log("READY TO BE DESTRUCTED"); });
            d.destroy();
        }
    

    In case of C++ side code can be something like:

        auto lv = engine.rootObjects()[0]->findChild<QObject*>("listview");
        auto component = lv->property("delegate").value<QQmlComponent*>();
        auto delegate = component->create();
        qDebug() << delegate->objectName();
        delegate->deleteLater();
    

  • Moderators

    @galilio said in Read of delegate objectName:

    ListView{
    id: listViewId
    objectName:"listViewObj"
    ....
    delegate: Rectangle {
    	id: rectnagleId
    	objectName: "rectangleDelegate"
    	....
    	}
    }
    
    //to get item and access the properies
    
    function getItemAtIndex(index){
        var item = listViewId.itemAtIndex(index);
        if(item){
              console.log(item.objectName)
        }
    }
    


  • @j-hilk
    my qt version is 5.9.1


  • Moderators

    @galilio fair enough.

    alright, trick 17 (untested)

    ListView{
    id: listViewId
    objectName:"listViewObj"
    var testObject: undefined
    signal assignToObject(var id)
    ....
    delegate: Rectangle {
    	id: rectnagleId
    	objectName: "rectangleDelegate"
            Connections{
                 target: listViewId
                 onAssignToObject: if(index === id) listViewId.testObject = rectnagleId
            }
    	....
    	}
    }
    //to get item and access the properies
            onTestObjectChanged:{
                if(testObject)
                    console.log(testObject.objectName)
            }
    
    


  • @j-hilk said in Read of delegate objectName:

    onAssignToObject: if(index === id) listViewId.testObject = rectnagleId

    what is your id here
    Thanks


  • Moderators

    @galilio said in Read of delegate objectName:

    @j-hilk said in Read of delegate objectName:

    onAssignToObject: if(index === id) listViewId.testObject = rectnagleId

    what is your id here
    Thanks

    the argument of the signal
    signal assignToObject(var id)



  • This post is deleted!


  • Sorry:
    nothing happens
    Slot was not called


  • Moderators

    @galilio
    works fine in my test file

    import QtQuick 2.12
    import QtQuick.Window 2.12
    import QtQuick.Controls 2.0
    
    Window {
        visible: true
        width: 400
        height: 750
        title: qsTr("Hello World")
    
        id: root
        property int testIndex: 0
        Timer{
            running: true
            interval: 1000
            repeat: true
            onTriggered: {
                listViewId.assignToObject(root.testIndex)
                testIndex++
                if(testIndex >= 10)
                    testIndex = 0
            }
        }
    
        ListView{
            id: listViewId
            anchors.fill: parent
            objectName:"listViewObj"
            property var testObject: undefined
            onTestObjectChanged:{
                if(testObject)
                    console.log(testObject.objectName)
            }
            signal assignToObject(var id)
    
            model: 10
            spacing: 2
    
            delegate: Rectangle {
                id: rectnagleId
                objectName: "rectangleDelegate" + index
                Text {
                    text: modelData
                    anchors.centerIn: parent
                }
                width: listViewId.width
                height:  20
                color: "green"
                Connections{
                    target: listViewId
                    onAssignToObject: if(index === id) listViewId.testObject = rectnagleId
                }
            }
        }
    }
    


  • @J-Hilk

    and how is it if I want to test the delegate with unit test (in cpp) sorry


 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.