我有一个QAbstractListModel-derived C++类,它包含两种类型的东西的列表,例如:
class MyList : public QAbstractListModel
{
Q_OBJECT
public:
MyList();
int rowCount(const QModelIndex& parent = QModelIndex()) const override
{
return mData.size();
}
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override
{
int i = index.row();
if (i < 0 || i >= mData.size())
return QVariant(QVariant::Invalid);
return QVariant::fromValue(mData[i]);
}
private:
QList<Something> mData;
};假设数据有一个布尔成员,以便在QML中我可以这样做:
Repeater {
model: myList
Text {
text: model.display.someBoolean ? "yes" : "no"
}
}我的问题很简单。如何使列表仅显示someBoolean为真的项?也就是说,我如何过滤列表?
我知道QSortFilterProxyModel,但文档中只提到了C++。我是否必须创建一个QAbstractItemModel*作为Q_PROPERTY of MyList,然后将QML模型设置为它?是像这样吗?
Repeater {
model: myList.filteredModel
...
class MyList : public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY(QAbstractItemModel* filteredModel READ filteredModel ... etc)
public:有人有任何指导或例子吗?
注:我见过this question。它没有回答这个问题,而且看起来也不是关于QML的,尽管标题是这样的。
发布于 2014-11-03 16:50:06
您需要对QSortFilterProxyModel进行子类化,并按照文档的建议在其中进行筛选。然后,您需要将QSortFilterProxyModel对象分配给所需的QML对象。这就是QML对象接收过滤数据的方式。
发布于 2016-08-16 14:53:18
如果您想要一种进行可视化筛选的方法,您可以让视图的委托不为不应该可见的项绘制。
Repeater {
model: myList
Text {
text: model.display.someBoolean ? "yes" : "no"
}
delegate: {
visible: model.someBoolean
height: visible ? 30 /* or whatever height */ : 0
// other drawing code here.
}
}这可能有其他视觉伪影(例如,如果您有基于索引的行颜色交替,行可能不能正确地交替),但是如果您想要一个快速和脏的过滤器,它可以工作。
https://stackoverflow.com/questions/26717209
复制相似问题