2017-02-23 33 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:

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(); 
      } 
     } 
    } 

} 

我測試了這兩種:

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

沒有成功。 那麼,該怎麼做?

謝謝

回答

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,它得到時銷燬。

我推薦前者,如果你想連接是永久性的,而後者,如果你可能要在一段時間內斷開。

onItemAdded/onRemoved處理程序,如果你不爲Repeater聲明delegate尤爲重要。例如,如果您使用DelegateModelObjectModel,則會發生這種情況。與這些模型,你不能確定,對象實例化或破壞時Repeater添加或刪除它們,你不能使用經常提到:Component.onCompleted/onDestruction,所以我認爲itemAdded/Removed -signals上/更普遍的使用與Repeater