2017-02-23 8 views
1

私は以下のqmlファイルを持っています。main.qmlはTestWindow.qml要素を作成します。QMLとリピータとの間の信号

TestWindow.qml(mySignalToMainWindow()ボタンをクリック)の信号をmain.qml、testConnection()の関数に接続したいとします。

main.qml

Window { 
    id: _component 

    property int instances: 3 

    width: 200 
    height: Screen.height/2 
    visible: true 

    Component.onCompleted: { 
     x = 40 
     y = 40 
    } 

    Repeater { 
     id: _windows 
     model: instances 
     TestWindow { 
      index: model.index 
      leftOffset: _component.width 
     } 
    } 

    Column { 
     Repeater { 
      model: instances 
      Button { 
       text: "Window " + index 
       onClicked:{ _windows.itemAt(index).window.raise(); 
       } 
      } 
     } 
    } 

    function testConnection(){console.log("Subwindow To Main Window")} 
} 

そしてTestWindow.qml:なし成功と

How to bind to a signal from a delegate component within a ListView in QMLHow to access dynamically/randomly loaded Repeater items in QML?

Item { 
    id: _windowItem 
    property int index 
    property int leftOffset 
    property alias window: _window 
    signal mySignalToMainWindow() 

    Window { 
     id: _window 

     visible: true 
     title: "SubWindowText " + index 

     Component.onCompleted: { 
      x = leftOffset 
      y = 40 
      width = Screen.width - leftOffset 
      height = Screen.height/2 
     } 

     Text { 
      id: windowText 
      text: qsTr("SubWindowText") 
     } 

     Button { 
      text: "SubWindow " + index 
      onClicked: {console.log("TestWindow::Button onClicked "+_window); 
       _windowItem.mySignalToMainWindow(); 
      } 
     } 
    } 

} 

私はそれらの2をテストしました。 それで、どうすればいいですか?

ありがとうございました

答えて

2

複数のオプションがあります。最初は、デリゲートのためComponentを作成するときに、結合を定義することです:

Repeater { 
    id: _windows 
    model: instances 
    TestWindow { 
     index: model.index 
     leftOffset: _component.width 
     onMySignalToMainWindow: testConnection() <--- Here you can connect it. 
    } 
} 

それを取得するとき別のオプションは、onItemAddedonItemRemoved -Handlersを使用して、そこ機能(mySignalToMainWindow.connect(functionToConnect))を接続することで、それぞれのdisconnect破壊されました。

接続を永続化する場合は前者を、後で切断する場合は後者をお勧めします。

Repeaterdelegateを宣言しないと、onItemAdded/onRemovedハンドラは特に重要です。これは、たとえばDelegateModelまたはObjectModelを使用した場合に発生します。これらのモデルと同様に、Repeaterがオブジェクトを追加または削除したときにオブジェクトがインスタンス化されたり破棄されたりする場合は、よく言及されているものを使用できませんでした:Component.onCompleted/onDestructionだから、itemAdded/Removed- Repeaterとなります。

関連する問題