Qt 是否可以使Qml中的Repeater委托以通用方式对给定项进行操作?

Qt 是否可以使Qml中的Repeater委托以通用方式对给定项进行操作?,qt,qml,qt-quick,Qt,Qml,Qt Quick,{Qml(使用Qt5.1beta的Quick2.0)和学习的新手} 我想知道这样的习惯用法在Qml中是否可行: 下面我有一个objLeftColumn,它希望它的子对象公开一个布尔m_biselected和一个MouseArea别名m_mouseProperty,并使用它们使这些子对象的集合相互排斥,即,只有一个子对象可以处于selected状态。下面的工作很好,但我需要重复它,每次我想,特别是如果我想它的行等 Column { id: objLeftColumn

{Qml(使用Qt5.1beta的Quick2.0)和学习的新手}

我想知道这样的习惯用法在Qml中是否可行: 下面我有一个objLeftColumn,它希望它的子对象公开一个布尔m_biselected和一个MouseArea别名m_mouseProperty,并使用它们使这些子对象的集合相互排斥,即,只有一个子对象可以处于selected状态。下面的工作很好,但我需要重复它,每次我想,特别是如果我想它的行等

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文件中),它可以在列中安排给定的项,同时处理它们选择的排他性

这样做的目的不是将组件直接交给代理,我稍后会给出,对于组件的每个实例化(取决于上面和下面模型的数值),代理:in 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
}

因此,排他中的这个列更通用,可以使用分配给其委托的任何项调用,其行为类似。这在qml中是否可能?这需要一些技巧才能解决,我可以想出两种方法:

  • 使用JS函数手动创建连接。大概是这样的:

    Repeater {
        id: objLeftColumnRepeater
        model: 5
    
        onItemAdded: {
            item.m_mouseProperty.onClicked.connect(function() {
                console.log("Clicked!");
            });
        }
    }
    
    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")                
            }
        }
    
  • 使用
    加载器
    将代理包装到
    中,并使用元素进行连接。大概是这样的:

    Repeater {
        id: objLeftColumnRepeater
        model: 5
    
        onItemAdded: {
            item.m_mouseProperty.onClicked.connect(function() {
                console.log("Clicked!");
            });
        }
    }
    
    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")                
            }
        }
    

  • 这需要一些技巧才能解决,我可以想出两种方法:

  • 使用JS函数手动创建连接。大概是这样的:

    Repeater {
        id: objLeftColumnRepeater
        model: 5
    
        onItemAdded: {
            item.m_mouseProperty.onClicked.connect(function() {
                console.log("Clicked!");
            });
        }
    }
    
    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")                
            }
        }
    
  • 使用
    加载器
    将代理包装到
    中,并使用元素进行连接。大概是这样的:

    Repeater {
        id: objLeftColumnRepeater
        model: 5
    
        onItemAdded: {
            item.m_mouseProperty.onClicked.connect(function() {
                console.log("Clicked!");
            });
        }
    }
    
    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")                
            }
        }