2

我在 QML 中有带有自定义委托的 ListView 项目:

Component{


    id: contactDelegate

    Item
    {
        id: wrapper;
        width: 306; height: 40

        FlipableImage
        {
            id: flipableImage
            width: 30
            height: 30

            anchors.verticalCenter: wrapper.verticalCenter;
            anchors.left:  wrapper.left
            anchors.leftMargin: 10

            frontImage: serverIconSource;
            backImage: "qrc:/images/resources/images/log.png";
        }

        Column
        {
            anchors.left: flipableImage.right
            anchors.leftMargin: 10
            Text
            {
                font.family: helveticaNeueBoldFont.name
                font.pixelSize: 14
                text: serverName;
            }

            Text
            {
                font.family: helveticaNeueFont.name
                font.pixelSize: 14
                text: serverLogin;
            }
        }

        ConnectionStateImage
        {
            id: stateImage
            state: "noState"
            anchors.verticalCenter: parent.verticalCenter;
            anchors.right: wrapper.right
            anchors.rightMargin: 10
            visible: itemMouseArea.containsMouse;
        }

        MouseArea
        {
            id: mouseArea;
            anchors.fill: flipableImage
            hoverEnabled: true;
            z: 1
            onEntered:
            {
                flipableImage.flipped = !flipableImage.flipped;
            }
            onExited:
            {
                flipableImage.flipped = !flipableImage.flipped;
            }
        }
    }
}

鼠标悬停flipableImage翻转。但我需要在模型或 QDeclarativeView 的事件上手动翻转它。如何导航到列表视图中的项目以更改 FlipableImage 的属性。从 qml 或 C++ 导航对我来说并不重要。谢谢。

4

2 回答 2

2

QML 列表视图元素的特殊属性之一是它只创建一次可见的委托项目。一旦它们移出视口,它们就会被销毁。

因此,无法知道代表源模型的一个特定项目是否在特定时间实际存在。这也是为什么没有itemAt(index)Repeater元素那样的方法的原因。

解决问题的最佳方法是在委托组件本身中以声明方式解决它:

  • 删除鼠标区​​域中的显式分配flipableImage.flipped,实际上根本不需要所有事件处理程序。

  • 给组件一个布尔属性以指示该项目是否被强制翻转,根据您的实际逻辑在列表视图中分配属性的值。由于上述原因,您也必须以声明方式执行此操作。一个好的策略可能是将index属性与保存索引的变量进行比较。

  • 最后以声明方式计算翻转状态:

    Item {
         id: wrapper
         property bool manuallyFlipped: false       
         /* ... */
         FlipableImage {
             /* ... */
             flipped: mouseArea.containsMouse || wrapper.manuallyFlipped
         }
         /* ... */
    }
    
于 2013-01-04T17:36:14.263 回答
1

如果我是你,我不会在 QML 委托中保存项目的状态。我会从中派生出我自己的模型QAbstractListModel,将它从 C++ 公开到 QML 并在那里保持任何项目的状态。如何暴露模型写在这里。要设置列表中项目的值,您必须导出到模型类的 QML C++ 方法,因为您将无法通过 QML 中的赋值来设置项目模型值(至少据我所知)。

MouseArea {
//...
    onEntered {
        myModel.itemAtIndexEntered(currentIndex);
    }
//...
}

要将 C++ 函数导出到 qml,您必须将它们作为插槽或添加Q_INVOKABLE到它们的声明中。您可以在此处找到更多详细信息。

于 2013-01-04T18:54:05.570 回答