我在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。
答案 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。