Qml访问列表视图项

时间:2013-01-04 13:53:07

标签: c++ qt qml

我在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 ++导航对我来说并不重要。 THX。

2 个答案:

答案 0 :(得分:2)

QML列表视图元素的一个特殊属性是它只创建一次可见的委托项。一旦他们离开视口,他们就会被摧毁。

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

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

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

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

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

    Item {
         id: wrapper
         property bool manuallyFlipped: false       
         /* ... */
         FlipableImage {
             /* ... */
             flipped: mouseArea.containsMouse || wrapper.manuallyFlipped
         }
         /* ... */
    }
    

答案 1 :(得分:1)

如果我是你,我不会在QML代表中持有某个项目的状态。 我将从QAbstractListModel派生我自己的模型,将它从C ++暴露给QML并保存任何项目的状态。如何公开模型是here。 要设置列表中项目的值,您必须导出到模型类的QML C ++方法,因为您将无法通过QML中的赋值设置项目模型值(至少就我记忆所述)。

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

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