首页 > 解决方案 > 如何将动态创建的对象的指针作为信号参数发送到 self(this)

问题描述

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

标签: qtqmlqt5signals-slots

解决方案


目前还不清楚你想要实现什么,我只是想我做对了。因此,您可以使用与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);
            });
        }
    }
}

测试.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不改变项目。最后,根项目接收到带有项目引用和参数的信号。


推荐阅读