2017-10-19 18 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を使用して何かを渡すことはできますが、通常は範囲を絞り込む方が効率的です。しかし、

 MyRectangle {    
      onSendId: tempNumber.setSelected(item) 
     } 

:あなたは厄介不可欠接続構文を避けることができるので、あなたは、シグナルハンドラでitemにアクセスすることができ、その代わりに、あなたは、単にでき

signal sendId(Item 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

関連する問題