可以在GridView中隐藏某些单元格吗?我设置了委托,但我仍然有这个GridView元素的空位。有可能这样做吗?
visible: false
width: 0
height: 0
答案 0 :(得分:3)
正如评论中所说,你确实可以使用QSortFilterProxy模型,但这是另一种解决方案。您可以使用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"
}
]
}
解释:每次将项目添加到模型中时,都会将其添加到"默认" group,触发将调用onChanged
的{{1}}处理程序。
过滤器()将查找默认组中的项目,并将其移动到filter()
组(这将使其可见)或移至items
组,具体取决于filterAccepts函数。
当filterAccept发生变化时,SortProxyModel会将每个项目移动到默认组以触发全局重新过滤。
然后您可以使用这样的代理模型:
hidden
答案 1 :(得分:0)
另一种仅使用QML的简化解决方案,基于隐藏项目。
import QtQuick 2.7
import QtQuick.Window 2.2
import QtQuick.Layouts 1.2
Window {
id: window
title: "test"
visible: true
width: 400
height: 400
GridLayout {
id: layout
anchors.fill: parent
columns: 4
Repeater {
id: container
model: 20
Rectangle {
id: item
property int itemIndex: index
Layout.fillWidth: true
height: 60
color: Qt.rgba(Math.random(),Math.random(),Math.random(),1)
Text {
anchors.centerIn: parent
text:item.itemIndex
}
MouseArea {
anchors.fill: parent
onClicked: {
item.visible = false;
layout.doIt(item.itemIndex);
}
}
}
}
function doIt(index)
{
var item = container.itemAt(index);
if(item)
item.visible = false;
for(var i = index - 1;i >= 0;i --)
{
var prev_item = container.itemAt(i);
if(prev_item.visible) {
prev_item.Layout.columnSpan ++;
break;
}
}
}
}
}