在QML中过滤/排序QAbstractListModel



我有一个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*作为MyListQ_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.
    }
}

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

相关内容

  • 没有找到相关文章

最新更新