2017-10-19 47 views
0

我有一个可以包含文本的矩形屏幕。这些矩形的文本内容应该允许通过点击使用该组件的屏幕上的按钮来改变。我遇到的问题是如何知道在使用这个组件的屏幕上选择了哪个实例。我想通过发送一个信号来解决这个问题,该信号传输实例的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) 
       } 
      } 

回答

2
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文件的根对象中声明属性时,属性才会有效。

+0

非常感谢! – numberCruncher