可以使Qml中的Repeater委托以通用的方式表现给定的项吗?

时间:2013-06-18 03:58:03

标签: qt qml qt-quick

{Qml新手(使用Qt 5.1 beta快速2.0)和学习}。

我想知道Qml中是否可以使用这样的成语: 下面我有objLeftColumn,它希望它的子节点暴露一个布尔m_bIsSelected和一个MouseArea别名m_mouseProperty并使用它们使这些子集的集合相互排斥,即,只有其中一个可以处于选中状态。以下工作正常但我需要每次都需要重复它,特别是如果我想要它等行等。

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中应该表现与此类似。

例如,在psedo代码中:

在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

中是否可行

1 个答案:

答案 0 :(得分: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")                
            }
        }