qt - QML GridView 隐藏一个单元格
问题描述
可以在 GridView 中隐藏某些单元格吗?我设置了委托,但这个 GridView 元素仍然有空位。有可能做到这一点吗?
visible: false
width: 0
height: 0
解决方案
正如评论中所说,您确实可以使用 QSortFilterProxy 模型,但这是另一种解决方案。你可以实现一个纯 QML FilterProxyModel,使用DelegateModel
和DelegateModelGroup
import QtQuick 2.10
import QtQml.Models 2.3
DelegateModel {
property var filterAccepts: function(item) {
return true
}
onFilterAcceptsChanged: refilter()
function refilter() {
if(hidden.count>0)
hidden.setGroups(0, hidden.count, "default")
if(items.count>0)
items.setGroups(0, items.count, "default")
}
function filter() {
while (unsortedItems.count > 0) {
var item = unsortedItems.get(0)
if(filterAccepts(item.model))
item.groups = "items"
else
item.groups = "hidden"
}
}
items.includeByDefault: false
groups: [
DelegateModelGroup {
id: default
name: "default"
includeByDefault: true
onChanged: filter()
},
DelegateModelGroup {
id: hidden
name: "hidden"
}
]
}
解释:每次将一个项目添加到模型中时,它都会添加到“默认”组中,这会触发onChanged
将调用的处理程序filter()
。
Filter() 将在默认组中查找项目,并将它们移动到items
组中(这将使它们可见)或hidden
组中,具体取决于 filterAccepts 函数的结果。
当 filterAccept 更改时,SortProxyModel 会将每个项目移动到默认组以触发全局重新过滤。
然后,您可以像这样使用您的代理模型:
FilterProxyModel
{
id: filterProxyModel
model: <YourBaseModel>
delegate: <YourDelegate>
filterAccepts: function(item) {
// Eg: Only "small" items will be displayed
return item.size == "small"
}
}
GridView
{
anchors.fill: parent
model: filterProxyModel
cellHeight: 100
cellWidth: 100
}
推荐阅读
- javascript - 单击按钮时如何在 URL 中添加值而不重新加载/重新定位页面
- android - 如何仅在本机反应中为特定仪表板创建横向模式?
- matlab - Matlab中未定义的函数'head'
- java - 有人可以在程序的帮助下解释哈希表冲突是如何发生的吗?
- android - 调用 adapter.notifyItemChanged(position) 但 position+1 处的 itemView 被解除
- java - 从JVM检索jar文件?
- angular - 如何将具有不同数据集的多个表添加到exceljs中的同一张表中
- single-sign-on - 站点 id = 2 的 Shibboleth SP 配置无法使其正常工作
- powershell - PowerShell - 错误的数组长度/计数(为空时为 1)
- sql-server - 将 PDF 插入 SQL 表