有没有办法隐藏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
}
}
}
如果只有ListView可以忽略不可见的Item
s'height
,则上面的解决方案会很好。
手动将height
设置为0
对性能不利,因此我需要更好的解决方案。你能帮帮我吗?
答案 0 :(得分:1)
您可以使用QSortFilterProxyModel过滤值:
m_filterModel->setSourceModel(m_model);
答案 1 :(得分:0)
我希望这可以解决问题。对于像我这样的初学者来说,解决这个问题有助于进一步了解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");
}
}
}
}
}
答案 2 :(得分:0)
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()
}
}
答案 3 :(得分:0)
这是 ListView 的一个限制,目前仍未解决。解决方案是按照其他回复的建议使用其他模型进行过滤(或调整当前模型)。
或者更好的解决方案是将您的 ListView
替换为
ScrollView { Column { Repeater {} } }
所以代替:
ListView {
anchors.fill: parent
model: ...
delegate: ...
}
做:
ScrollView {
anchors.fill: parent
Column {
Repeater {
model: ...
delegate: ...
}
}
}