【问题标题】:Hide an item (delegate) inside a ListView QML在 ListView QML 中隐藏一个项目(委托)
【发布时间】:2018-07-11 21:58:46
【问题描述】:

有没有办法在 ListView 中的某个事件上隐藏特定项目?

到目前为止,我可以通过将 visible 设置为 false 并将 height 设置为零代表来做到这一点。

但是,如果我将 listView 中的间距设置为 2,例如,这个解决方案似乎被破坏了。

【问题讨论】:

  • 您应该将间距作为委托的一部分实现或使用QSortFilterProxyModel
  • 是的,一定要在委托中放置空格,代理在 IMO 中太过分了。
  • 这取决于需要隐藏的代表数量。
  • @folibis 停止设置height = 0 - spacing
  • 在我看来,更简洁的解决方案是模型本身更新并删除您不想显示的项目(不是内存中的数据,而是模型中的元素)。这需要更多的工作,但如果您在不同的视图中显示此列表,它会变得更加健壮且易于管理。

标签: qt qml


【解决方案1】:

解决此问题的方法是将ListView 的间距设置为 0,并在委托本身中实现它。像这样的:

ListView{
   id: listView
   spacing: 0
   delegate: Item{
      id: itemDelegate
      width: parent.width; height: spacingRect.height + actualDelegate.height
      Item {id: actualDelegate;} // your actual delegate
      Rectangle{ id: spacingRect; height: 2; width: parent.width; color: "transparent"; anchors.top: actualDelegate.bottom}
   }
}

这样当你隐藏代理时,间距也会被隐藏

【讨论】:

    【解决方案2】:

    我认为正确的方法是使用代理模型来过滤掉不应该显示的元素。 您可以使用QSortFilterProxyModel 或实现您自己的QAbstractProxyModel。 有了它,甚至可以对元素的移除和添加进行动画处理。

    如果您不想接触 C++ 并且性能不是问题,请使用 SortFilterProxyModel

    【讨论】:

      猜你喜欢
      • 2015-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      相关资源
      最近更新 更多