繁体   English   中英

Qt QML:获取对发出信号的对象的引用

[英]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)没有被sendIdsendId(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM