我有许多动态创建的qml对象,这些对象具有一个显式声明的父对象。我想将每个对象的每个信号连接到其父对象的方法,并且需要区分哪个对象发送了信号。我想发送对象指针作为信号参数。这可能吗?如果不是,我该如何实现自己想要的?
答案 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
而不更改项目。最终,根项目接收到带有项目参考和参数的信号。