C++ 对列表视图项的Qml访问
我在QML中具有具有自定义委托的ListView项: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
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 } /* ... */ }
MouseArea {
//...
onEntered {
myModel.itemAtIndexEntered(currentIndex);
}
//...
}