Qt QML:获取发射信号的对象的参考
问题描述:
我有一个可以包含文本的矩形屏幕。这些矩形的文本内容应该允许通过点击使用该组件的屏幕上的按钮来改变。我遇到的问题是如何知道在使用这个组件的屏幕上选择了哪个实例。我想通过发送一个信号来解决这个问题,该信号传输实例的id作为参考,但看起来这不起作用。这怎么可能完成?在这里我自定义的矩形组成Qt QML:获取发射信号的对象的参考
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
是你的QML文件根对象,sendId(root)
将工作太只要sendId
没有被映射,根成员可以直接引用,请记住,这只适用于根对象,它不适用于直接或间接父对象而不是根对象。
这是推荐的做法,放弃提供一切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文件的根对象中声明属性时,属性才会有效。
非常感谢! – numberCruncher