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

时间:2018-08-03 13:54:56

标签: qt qml qt5 signals-slots

我有许多动态创建的qml对象,这些对象具有一个显式声明的父对象。我想将每个对象的每个信号连接到其父对象的方法,并且需要区分哪个对象发送了信号。我想发送对象指针作为信号参数。这可能吗?如果不是,我该如何实现自己想要的?

1 个答案:

答案 0 :(得分:1)

目前尚不清楚您要实现什么目标,我只是猜对了。 因此,您可以使用类似于 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而不更改项目。最终,根项目接收到带有项目参考和参数的信号。