1

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

我想知道在 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 文件中),它可以在 Column 中排列给定的项目,同时处理它们的选择的排他性吗?

这个想法不是将组件直接提供给委托,而是稍后将其提供给组件,并且对于组件的每个实例化(取决于上面和下面的模型的数值),委托:在中继器中的行为应该类似。

例如,在伪代码中:

在 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中可能吗

4

1 回答 1

1

这需要一些技巧来解决,我可以想到两种方法:

  1. 使用 JS connect()函数手动创建连接。像这样的东西:

    Repeater {
        id: objLeftColumnRepeater
        model: 5
    
        onItemAdded: {
            item.m_mouseProperty.onClicked.connect(function() {
                console.log("Clicked!");
            });
        }
    }
    
  2. 使用 a将委托包装到ItemaLoader中,并使用一个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")                
            }
        }
    
于 2013-06-19T21:24:14.237 回答