qml - 在 QML 中过滤/排序 QAbstractListModel

标签 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;
};

假设数据有一个 bool 成员,这样在 QML 中我可以做这样的事情:

Repeater {
    model: myList
    Text {
        text: model.display.someBoolean ? "yes" : "no"
    }
}

我的问题很简单。如何使列表显示someBoolean为true的项目? IE。如何过滤列表?

我知道QSortFilterProxyModel,但文档仅提到C++。我是否必须创建一个 QAbstractItemModel* 作为 MyListQ_PROPERTY,然后为其设置 QML 模型?像这样吗?

Repeater {
    model: myList.filteredModel

...

class MyList : public QAbstractListModel
{
    Q_OBJECT
    Q_PROPERTY(QAbstractItemModel* filteredModel READ filteredModel ... etc)
public:

有人有任何指导或示例吗?

注意:我见过this question 。尽管有标题,但它没有回答问题,而且似乎与 QML 无关。

最佳答案

您需要继承 QSortFilterProxyModel 并按照文档的建议在其中进行过滤。然后您需要将 QSortFilterProxyModel 对象分配给所需的 QML 对象。这就是 QML 对象接收过滤数据的方式。

关于qml - 在 QML 中过滤/排序 QAbstractListModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26717209/

相关文章:

c++ - func(QWidget* const &widget) VS func(QWidget* const 小部件)

qt - QAbstractItemModel 装饰工具提示

c++ - 子类化:QAbstractItemModel 没有成员

Qt错误 "persistent model indexes corrupted"为什么?

qt - qml 中的段落缩进

android - 如何让 QML TextField 绑定(bind)在 Android 下工作?

javascript - 处理 ListView 的嵌套 JSON 数据

javascript - QML:如何使用 javascript 创建嵌套模型?

c++ - 如何在不设置最大化的情况下使尺寸最大化?

c++ - 如何删除qt5中的子目录