【问题标题】:Why QML ListView delegate doesn't react on selection changes immediately?为什么 QML ListView 委托不会立即对选择更改做出反应?
【发布时间】:2017-12-16 22:23:01
【问题描述】:

我想知道为什么这不起作用?

ListView {
   id: root
   property var selection: QtObject {}
   ...
   delegate: MyView {
       focused: ListView.isCurrentItem
       selected: root.selection[index] === true

       Rectangle {
          id: selectionOverlay
          anchors.fill: parent
          color: "red"
          opacity: 0.3
          visible: selected
      }

   }

   Keys.onPressed: if (event.key === Qt.Key_Space) {
                        if(!root.selection[root.currentIndex])
                           root.selection[root.currentIndex] = true;
                       else 
                           root.selection[root.currentIndex] = false;
    }
}

也就是说,委托不会对选择对象中的更改做出反应。只有在重新创建索引的委托时才能看到选择(例如,当滚动足够远并向后滚动时)。

root.selection[index] 更改为ListView.view.selection[index] 也无济于事。

我需要在 ListView 级别进行选择以管理多选内容。 一直在敲我的头。

谢谢!

【问题讨论】:

    标签: qt listview qml selection


    【解决方案1】:

    问题在于,通过更改 selection 属性的子属性,selection 属性的更改信号本身不会被发出。

    QML 绑定机制仅在属性本身的值发生变化时才起作用。但是在您的情况下,selection 指向的对象永远不会改变,因此如果selection 的某些子属性发生更改,您将无法收到通知。

    作为一种解决方法,您可以在其任何子属性更改后重新分配/刷新整个选择对象。

    【讨论】:

    • 好吧,我确实会在鼠标点击时更新当前索引,但问题不在于鼠标。当我按空格键时,我可以在控制台中看到 Listview 的 selection 属性已更新,但未重绘委托以反映这一点。
    • 基本上我需要一种方法来告诉可见的代表检查他们的属性绑定并在发生变化时重绘
    • @AlexJenter 绑定仅在属性值更改时起作用。在你的情况下,它不会改变。
    • @AlexJenter 我认为最好在 model 级别处理选择性。它可以成为您项目的一个选项吗?
    • @AlexJenter 属性“change”表示该属性指向的对象在被更改的堆中的地址。在您的情况下,向 selection 属性添加/删除子属性不被视为“更改”,因为主机对象(selection 指向的堆中的对象)保持不变。
    猜你喜欢
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    相关资源
    最近更新 更多