Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对列表视图项的Qml访问_C++_Qt_Qml - Fatal编程技术网

C++ 对列表视图项的Qml访问

C++ 对列表视图项的Qml访问,c++,qt,qml,C++,Qt,Qml,我在QML中具有具有自定义委托的ListView项: Component{ id: contactDelegate Item { id: wrapper; width: 306; height: 40 FlipableImage { id: flipableImage width: 30 height: 30

我在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;
            }
        }
    }
}
鼠标悬停时FlipTableImage已翻转。但我需要在模型或QDeclarativeView的事件中手动翻转它。如何在列表视图中导航到项目以更改FlipTableImage的属性。从QML或C++中导航对我来说并不重要。
Thx.

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

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

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

  • 删除鼠标区域中的
    flipableImage.flipped
    的显式赋值,实际上所有事件处理程序都不需要

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

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

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

若我是你们,我不会在QML委托中保存项目的状态。 我将从<代码> QuastListMeals>代码>中导出自己的模型,将其从C++暴露到QML并保持其中的任何项的状态。编写了如何公开模型。 要设置列表中的项的值,必须将其导出到模型类的QML C++方法中,因为您不能通过QML中的赋值来设置项目模型值(至少我记得)。p> < >将C++函数导出为QML,必须将它们作为时隙,或将<代码> QyNojkaby>代码>添加到它们的声明中。你可以找到更多的细节

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