2017-02-23 62 views
1

У меня есть следующие qml-файлы, main.qml создает элементы TestWindow.qml.Сигнал между QML с Repeater

Я хотел бы подключить сигнал в 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 QML и How to access dynamically/randomly loaded Repeater items in QML?

без успеха. Итак, как это сделать?

Thanks

ответ

2

У вас есть несколько вариантов. Во-первых, для определения связывания, при создании Component для делегата:

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

Другой вариант заключается в использовании onItemAdded и onItemRemoved -Handlers и подключить функцию там (mySignalToMainWindow.connect(functionToConnect)) и соответствующий disconnect, когда он получает уничтожены.

Я бы порекомендовал бывшему, если вы хотите, чтобы соединение было постоянным, а второе, если вы захотите отключиться через какое-то время.

Обработчики onItemAdded/onRemoved особенно важны, если вы не объявляете delegate для Repeater. Это происходит, например, если вы используете DelegateModel или ObjectModel. Как и в случае с этими моделями, вы не можете быть уверены, что объекты создаются или уничтожаются, когда Repeater добавляет или удаляет их, вы не можете использовать часто упоминаемые: Component.onCompleted/onDestruction, поэтому я считаю, что itemAdded/Removed -сигналы превосходят/более общие для использования с Repeater.