[英]QML ListView hidden delegate item
Is there any way to hide certain item in ListView
?有没有办法隐藏
ListView
某些项目?
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
ApplicationWindow {
title: qsTr("Hello World")
width: 640
height: 480
visible: true
ListView {
anchors.fill: parent
model: ListModel {
ListElement { color: "red"; visible: true}
ListElement { color: "green"; visible: false}
ListElement { color: "blue"; visible: true}
}
delegate: Rectangle {
width: parent.width
height: model.visible ? 30 : 0
color: model.color
visible: model.visible
enabled: model.visible
}
}
}
Solution above would be good if only ListView could ignore invisible Item
s' height
.如果只有 ListView 可以忽略不可见的
Item
s' height
上面的解决方案会很好。
Setting height
to 0
manually is bad for performance so I need a better solution.手动将
height
设置为0
对性能不利,所以我需要一个更好的解决方案。 Could you help me?你可以帮帮我吗?
I hope this will solve the problem.我希望这能解决问题。 For a beginner like me, solving this question has helped in understanding qml a bit more.
对于像我这样的初学者来说,解决这个问题有助于对 qml 有更多的了解。
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Window 2.0
ApplicationWindow {
width: 640
height: 480
visible: true
ListView {
id: displayListView
anchors.fill: parent
model: displayDelegateModel
}
ListModel {
id: myModel
ListElement { colo: "orange"; visible: true}
ListElement { colo: "red"; visible: false}
ListElement { colo: "white"; visible: true}
ListElement { colo: "black"; visible: false}
ListElement { colo: "green"; visible: true}
ListElement { colo: "yellow"; visible: false}
}
VisualDataModel {
id: displayDelegateModel
delegate: Rectangle {
width: parent.width
height: 30
color: colo
Text {
text: colo
anchors.centerIn: parent
font.bold: true
font.pixelSize: 20
}
}
model: myModel
groups: [
VisualDataGroup {
includeByDefault: false
name: "visible"
}
]
filterOnGroup: "visible"
Component.onCompleted: {
var rowCount = myModel.count;
items.remove(0,rowCount);
for( var i = 0;i < rowCount;i++ ) {
var entry = myModel.get(i);
if(entry.visible == true) {
items.insert(entry, "visible");
}
}
}
}
}
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Window 2.0
ApplicationWindow {
width: 640
height: 480
visible: true
property var model_items:[
{id: 0, _color: "red" , _visible: true},
{id: 1, _color: "blue" , _visible: false},
{id: 2, _color: "yellow" , _visible: true},
{id: 3, _color: "gray" , _visible: true},
]
ListView {
id: displayListView
anchors.fill: parent
model: myModel
delegate: Rectangle{
id: rec
width: 200
height: 200
color: _color
}
}
function createModel(){
myModel.clear()
for(var i=0;i<model_items.legth; i++)
if(model_items[i]._visible)
myModel.append(model_items[i])
}
ListModel {
id: myModel
}
Component.onCompleted: {
createModel()
}
}
您可以使用 QSortFilterProxyModel 来过滤值:
m_filterModel->setSourceModel(m_model);
This is a limitation of the the ListView that is still not resolved as of now.这是 ListView 的一个限制,目前仍未解决。 The solution is to either use another model for filtering (or adjust the current model) as suggested by other replies.
解决方案是按照其他回复的建议使用另一个模型进行过滤(或调整当前模型)。
Or a better solution is to replace your ListView
with a combination of或者更好的解决方案是用以下组合替换您的
ListView
ScrollView { Column { Repeater {} } }
So instead of:所以而不是:
ListView {
anchors.fill: parent
model: ...
delegate: ...
}
do:做:
ScrollView {
anchors.fill: parent
Column {
Repeater {
model: ...
delegate: ...
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.