Qt QML GridView隐藏一个单元格
可以在GridView中隐藏某些单元格吗?我设置了delegate,但是这个GridView元素的位置仍然是空的。有可能做到这一点吗Qt QML GridView隐藏一个单元格,qt,gridview,qml,Qt,Gridview,Qml,可以在GridView中隐藏某些单元格吗?我设置了delegate,但是这个GridView元素的位置仍然是空的。有可能做到这一点吗 visible: false width: 0 height: 0 正如在评论中所说,您确实可以使用QSortFilterProxy模型,但这里有另一个解决方案。您可以使用DelegateModel和DelegateModelGroup import QtQuick 2.10 import QtQml.Models 2.3 DelegateModel {
visible: false
width: 0
height: 0
正如在评论中所说,您确实可以使用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"
}
]
}
解释:每次将项目添加到模型中时,都会将其添加到“默认”组中,这将触发将调用filter()
的onChanged
处理程序
Filter()将查找默认组中的项目,并根据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
}
FilterProxyModel
{
id:FilterProxy模型
型号:
代表:
过滤器验收:功能(项目){
//只显示“小”项目
return item.size==“小”
}
}
网格视图
{
锚定。填充:父级
型号:FilterProxy模型
牢房高度:100
单元格宽度:100
}
另一个仅使用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;
}
}
}
}
}
隐藏意味着什么?例如,如果委托是矩形,中间是空格,或者不留空格。第二种情况是,我想在网格中隐藏一个单元格,并对其他单元格进行重新排序,以避免留下可用空间。您的模型是什么?看起来您所说的@Eylandesc QSortFilterProxyModel就是解决方案之一。另一个是在网格上更改GridView,其中包含转发器,所有内容都在Flickable中。它看起来一样,工作一样,我可以隐藏某些项目使用可见,高度和宽度。