Можно ли заставить репитер-делегат в Qml вести себя обычным образом по отношению к заданным элементам?

{Новое в Qml (быстрое 2.0 с использованием бета-версии Qt 5.1) и обучение}.

Я хотел знать, возможна ли такая идиома в Qml: ниже у меня есть объект objLeftColumn, который ожидает, что его дочерние элементы предоставят логическое значение m_bIsSelected и псевдоним MouseArea m_mouseProperty и использует их, чтобы сделать коллекцию таких дочерних элементов взаимоисключающими, т. Е. Только одним из них могут быть в выбранном состоянии. Следующее работает нормально, но мне нужно повторять его каждый раз, когда я хочу, особенно если я хотел это для Row и т. Д.

Column {
        id: objLeftColumn

        property int m_iLastButtonClicked: -1
        property int m_iCurrentButtonClicked: -1

        onM_iCurrentButtonClickedChanged: {
            if(m_iLastButtonClicked != -1) {
                objLeftColumn.children[m_iLastButtonClicked].m_bIsSelected = false
            }
            m_iLastButtonClicked = m_iCurrentButtonClicked
        }

        Repeater {
            id: objLeftColumnRepeater

            model: 5

            delegate: ABCD {
                id: objABCD

                m_mouseProperty.onClicked: {
                    if(m_bIsSelected) {
                        objLeftColumn.m_iCurrentButtonClicked = index
                    }
                    else {
                        objLeftColumn.m_iLastButtonClicked = -1
                        objLeftColumn.m_iCurrentButtonClicked = -1
                    }
                }
            }
        }
}

Могу ли я написать общий objLeftColumn (в отдельном qml-файле), который мог бы упорядочить данные элементы в столбце, в то же время имея дело с эксклюзивностью их выбора?

Идея состоит в том, чтобы вместо того, чтобы сразу же передать компонент делегату, я дам его позже, и для каждого экземпляра компонента (в зависимости от числового значения модели выше и ниже) делегат: в Repeater должен вести себя аналогичным образом.

например, в псевдониме:

в Exclusive.qml:

Column {
        id: objLeftColumn

        property int m_iLastButtonClicked: -1
        property int m_iCurrentButtonClicked: -1
        property alias m_delegate: objLeftColumnRepeater.delegate

        onM_iCurrentButtonClickedChanged: {
            if(m_iLastButtonClicked != -1) {
                objLeftColumn.children[m_iLastButtonClicked].m_bIsSelected = false
            }
            m_iLastButtonClicked = m_iCurrentButtonClicked
        }

        Repeater {
            id: objLeftColumnRepeater

            model: 5

           onItemAdded: {
               //state of item can be manipulated but want to
               //add behaviour to the item eg:
            /*item {
                 m_mouseProperty.onClicked: {
                 //do something
                 }
           }*/
           }
        }
}

в SomeOther.qml:

Exclusive {
    model: 5
    delegate: ABCD
}

Exclusive {
    model: 9
    delegate: DEFG
}

и т. д. Таким образом, Column in Exclusive является более общим и может вызываться с любым Item, назначенным его делегату, и будет вести себя аналогичным образом. Возможно ли это в qml


person ustulation    schedule 18.06.2013    source источник


Ответы (1)


Чтобы решить эту проблему, я могу придумать два способа:

  1. Используйте JS connect () для создания соединений вручную. Что-то вроде этого:

    Repeater {
        id: objLeftColumnRepeater
        model: 5
    
        onItemAdded: {
            item.m_mouseProperty.onClicked.connect(function() {
                console.log("Clicked!");
            });
        }
    }
    
  2. Оберните делегата в Item, используя Loader, и используйте Connections для подключения. Что-то вроде этого:

    property Component delegate
    Repeater {
        id: objLeftColumnRepeater
        model: 5
        delegate: Item {
            Loader {
                id: loader
                sourceComponent: delegate
            }
    
            Connections {
                target: loader.item.m_mouseProperty
                onClicked: console.log("Clicked")                
            }
        }
    
person Thomas McGuire    schedule 19.06.2013