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