在QML中过滤/排序QAbstractListModel

时间:2014-11-03 15:18:03

标签: qml qt5 qabstractitemmodel qsortfilterproxymodel

我有一个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的。

2 个答案:

答案 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.
    }
}

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