[英]Qt QML: Get reference to object emitting a signal
我的屏幕上有一些可以包含文本的矩形。 通过单击使用此组件的屏幕中的按钮,应允许更改这些矩形的文本内容。 我遇到的问题是如何知道在使用该组件的屏幕中选择了哪个实例。 我考虑过通过发出信号来解决此问题,该信号将实例的ID作为参考传输,但似乎不起作用。 如何做到这一点? 这是我的自定义矩形组件
Rectangle {
id: root
width: 50
height: 50
color: "#000000"
anchors.verticalCenter: parent.verticalCenter
border.color: "#555555"
property int value: 0
signal sendId(Item)
Text {
id: displayed_text
color: "#ffffff"
text: root.value
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
font.pixelSize: 15
}
MouseArea {
id: mouseArea
anchors.fill: parent
onClicked: {
root.border.color="#222222"
root.sendId(root.id)
}
}
}
此处是其他按钮应更改自定义组件内容的文件:
property Item selected: myRectangle
function changeSelected(value) {
selected.value=5
}
function setSelected(it) {
root.selected=it
}
MyRectangle {
id: myRectangle
Component.onCompleted: {
myRectangle.sendId.connect(tempNumber.setSelected)
}
}
MyRectangle {
id: myRectangle1
Component.onCompleted: {
myRectangle1.sendId.connect(tempNumber.setSelected)
}
}
MyRectangle {
id: myRectangle2
Component.onCompleted: {
myRectangle2.sendId.connect(tempNumber.setSelected)
}
}
root.sendId(root.id)
该id
不是常规属性。 不要这样使用它。 id
的目的是为您提供引用,您可以使用该引用来引用特定的对象,因此,您真正需要的是:
root.sendId(root)
如果root
是您的sendId(root)
文件根对象, sendId(root)
没有被sendId
, sendId(root)
也会起作用,可以直接引用根成员,请记住,这仅适用于根对象,对于是直接或间接父对象但不是根的对象。
建议您避免给所有内容提供id
,只有在您确实需要引用特定对象且不存在其他方法时才使用ID,因此建议您这样做。
您缺少的另一件事是,与JS函数不同,您必须为信号提供一些输入。 您仍然可以使用var
并传递任何内容,但是通常缩小范围的效率更高。 因此,您需要输入类型和标识符:
signal sendId(Item item)
这样,您可以访问信号处理程序中的item
,从而可以避免笨拙的命令式连接语法,因此可以简单地:
MyRectangle {
onSendId: tempNumber.setSelected(item)
}
但是,我想说您的设计不是可选的。 当您追求通用性和重用时,应该采用信号。 您的使用场景更加具体,因此可以完全避免使用信号:
// Rect.qml
Rectangle {
width: 50
height: 50
color: manager.selected === this ? "red" : "blue"
MouseArea {
anchors.fill: parent
onClicked: manager.selected = parent
}
}
// main.qml
Window {
id: manager
visible: true
width: 600
height: 300
property Item selected: null
Row {
spacing: 2
Repeater {
model: 10
delegate: Rect {}
}
}
}
如下例所示,只要可以在对象树中找到对象,就可以直接通过id访问对象。 属性同样适用,但是, id
对于树下的任何对象均适用,而属性仅在特定qml文件的根对象中声明时才适用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.