如何将动态创建的对象的指针作为信号参数发送给 self(this)

how to send dynamically created object's pointer to self(this) as a signal parameter

我有许多动态创建的 qml 对象,它们有一个显式声明的父对象。我想将每个对象的每个信号连接到它们父级的方法,我需要区分哪个对象发送了信号。我想发送对象指针作为信号参数。这可能吗?如果不是我怎么能达到我想要的?

不太清楚你想达到什么目的,我只是想我是对的。 因此,您可以使用类似于 this.

的子项 ID
import QtQuick 2.7
import QtQuick.Window 2.2

Window {
    id: window
    title: "test"
    visible: true
    width: 400
    height: 400

    Row {
        anchors.centerIn: parent
        id: root
        function itemClicked(item, serial)
        {
            console.log("Item (" + item + ") with serial: " + serial + " was clicked");
        }
        Repeater {
            model: 5
            delegate: Test {
                width: 50
                height: 50
                color: Qt.rgba(Math.random(),Math.random(),Math.random(),1)
                onPressed1: root.itemClicked(sender, serial)
                Connections {
                    onPressed2: root.itemClicked(target, serial);
                }
            }
        }
    }
}

如果您使用 Qt.createComponent 动态创建项目,只需将 Repeater 替换为以下代码:

Component.onCompleted: {
    for(var i = 0;i < 5;i ++)
    {
        var component = Qt.createComponent("Test.qml");
        if (component.status === Component.Ready)
        {
            var obj = component.createObject(root);
            obj.color = Qt.rgba(Math.random(), Math.random(), Math.random(), 1);
            obj.width = 50;
            obj.height = 50;
            obj.pressed1.connect(root.itemClicked);
            obj.pressed2.connect(function(serial){
                root.itemClicked(obj, serial);
            });
        }
    }
}

Test.qml

import QtQuick 2.7

Rectangle {
    id: item
    signal pressed1(Item sender, int serial)
    signal pressed2(int serial)
    property int serial: Math.round(Math.random() * 9999)
    MouseArea {
        anchors.fill: parent
        onClicked: {
            item.pressed1(item, item.serial);
            item.pressed2(item.serial);
        }
    }
    Text {
        anchors.centerIn: parent
        text:serial
    }
}

项目测试建议 onPressed 带有参数的信号。如果您可以修改您的项目并添加它,请使用 pressed1。或者使用 pressed2 而不更改项目。最后,根项目收到带有项目引用和参数的信号。