我有一个QAbstractListModel
派生的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*
作为MyList
的Q_PROPERTY
,然后将QML模型设置为它?像这样?
Repeater {
model: myList.filteredModel
...
class MyList : public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY(QAbstractItemModel* filteredModel READ filteredModel ... etc)
public:
有人有什么指导或例子吗?
注:我看过这个问题。它并没有回答这个问题,而且不管标题如何,它似乎都不是关于QML的。
您需要子类化QSortFilterProxyModel,并按照文档建议在其中进行筛选。然后,您需要将QSortFilterProxyModel对象分配给所需的QML对象。这就是QML对象接收过滤数据的方式。
如果您想要一种进行视觉过滤的方法,您可以让视图的委托不为不应该可见的项目绘制。
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.
}
}
这可能会有其他视觉瑕疵(例如,如果您有基于索引的交替行颜色,则行可能无法正确交替),但如果您想要一个快速且脏的过滤器,则它可以工作。