在QML中筛选/排序QAbstractListModel 我有一个 QuastListMease/Cuff-派生C++类,包含两类事物的列表,例如: class MyList:public-QAbstractListModel { Q_对象 公众: MyList(); int rowCount(常量QModelIndex&parent=QModelIndex())常量重写 { 返回mData.size(); } QVariant数据(常量QModelIndex&index,int-role=Qt::DisplayRole)常量覆盖 { int i=index.row(); 如果(i=mData.size()) 返回QVariant(QVariant::无效); 返回QVariant::fromValue(mData[i]); } 私人: QList-mData; };

在QML中筛选/排序QAbstractListModel 我有一个 QuastListMease/Cuff-派生C++类,包含两类事物的列表,例如: class MyList:public-QAbstractListModel { Q_对象 公众: MyList(); int rowCount(常量QModelIndex&parent=QModelIndex())常量重写 { 返回mData.size(); } QVariant数据(常量QModelIndex&index,int-role=Qt::DisplayRole)常量覆盖 { int i=index.row(); 如果(i=mData.size()) 返回QVariant(QVariant::无效); 返回QVariant::fromValue(mData[i]); } 私人: QList-mData; };,qml,qt5,qabstractitemmodel,qsortfilterproxymodel,Qml,Qt5,Qabstractitemmodel,Qsortfilterproxymodel,假设数据有一个布尔成员,因此在QML中我可以执行如下操作: 中继器{ 型号:myList 正文{ 文本:model.display.someBoolean?“是”:“否” } } 我的问题很简单。如何使列表仅显示someBoolean为真的项目?即,如何筛选列表 我知道QoStFieldPro XMyS> ,但是文档只提到C++。我是否必须创建一个qabstractemmodel*作为MyList的Q_属性,然后将QML模型设置为它?像这样 中继器{ 型号:myList.filteredMod

假设数据有一个布尔成员,因此在QML中我可以执行如下操作:

中继器{
型号:myList
正文{
文本:model.display.someBoolean?“是”:“否”
}
}
我的问题很简单。如何使列表仅显示
someBoolean
为真的项目?即,如何筛选列表

我知道QoStFieldPro XMyS> <代码>,但是文档只提到C++。我是否必须创建一个

qabstractemmodel*
作为
MyList
Q_属性
,然后将QML模型设置为它?像这样

中继器{
型号:myList.filteredModel
...
类MyList:公共QabStretchListModel
{
Q_对象
Q_属性(QAbstractItemModel*filteredModel读取filteredModel…等)
公众:
有人有任何指导或例子吗


注意:我已经看到了。它没有回答这个问题,而且不管标题如何,似乎也不是关于QML的。

您需要对QSortFilterProxyModel进行子类化,并按照文档建议在其中进行筛选。然后您需要将QSortFilterProxyModel对象分配给所需的QML对象。这就是QML对象接收过滤数据。

如果您想要一种进行视觉过滤的方法,可以让视图的委托不绘制不应该可见的项目

中继器{
型号:myList
正文{
文本:model.display.someBoolean?“是”:“否”
}
代表:{
可见:model.someBoolean
高度:可见?30/*或任意高度*/:0
//其他绘图代码在这里。
}
}

这可能有其他视觉瑕疵(例如,如果您有基于索引的交替行颜色,则行可能无法正确交替)但是,如果您想要一个快速且脏的过滤器,它可以工作。

哪里是存储
QSortFilterProxyModel
-派生类的最佳位置?正如我建议的那样,作为
MyList
的属性/成员?或者有更好的方法吗?Timmmm,您可以使用任何可用的方法:1)将指向代理模型的指针存储为类中的属性,然后然后在QML 2中使用“Repeater{model:myList.filteredModel}”,使用engine.rootContext()->setContextProperty(“filteredModel”,您的代理\模型\对象)创建上下文属性;然后使用“Repeater{model:filteredModel}”在QMLinvisible中,项目将导致内存泄漏情况,ListView将呈现n个不可见的项目数。@PatrickJoséPereira内存泄漏?或者只是在其正确处于作用域时内存使用可能过多?