1

我有一个自定义对象列表,我需要在 SwipeView 的多个页面中拆分这些对象。

现在,我实现了一个 QAbstractListModel,通过自定义角色将数据提供给我的 QML 视图。但是当我有超过给定数量的对象时,我需要将我的模型分成多个块,这些块将显示在 SwipeView 的不同页面上。

例如,如果我的模型有 20 个对象,我的 SwipeView 将有 2 个页面,第一个页面中有 12 个项目,第二个页面中有 8 个剩余项目,但项目的数量当然是动态的。

我知道我可以使用 QSortProxyFilter 或 DelegateModel 来根据条件过滤我的模型,但我不知道如何使用它们来创建可用作 SwipeView 页面内容的子模型的组。因为当然,我不能只在页面更改时更改过滤器,因为当从一页滑动到另一页时,这不会使项目可见。

感谢您提供有关如何实现此目的的任何提示或想法。

4

1 回答 1

0

为什么不将一个模型包含到另一个模型中?您可以通过 将模型返回给 QML QVariant::fromValue。看我的例子:

models.h

class ChildItem{
public:
    ChildItem() {}
};

class ChildModel: public QAbstractListModel{
    Q_OBJECT
public:
    explicit ChildModel(QObject *parent = nullptr);
    void addItem(const ChildItem &item);
    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
signals:
    void itemAdded();
protected:
    QHash<int,QByteArray> roleNames() const;
private:
    QVector<ChildItem> m_items;
};

class ModelItem{
public:
    ModelItem() {}
    ChildModel *childModel() const;
private:
    ChildModel *m_childModel;
};

class MainModel: public QAbstractListModel{
    Q_OBJECT
public:
    explicit MainModel(QObject *parent = nullptr);
    void addItem(const ModelItem &item);
    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
signals:
    void itemAdded();
protected:
    QHash<int,QByteArray> roleNames() const;
private:
    QVector<ModelItem> m_items;
};

models.cpp

ChildModel *ModelItem::childModel() const{
    return m_childModel;
}

QVariant MainModel::data(const QModelIndex & index, int role) const {
    if (index.row() < 0 || index.row() >= (int)m_items.size())
        return QVariant();
    const MainModel &item = m_items[index.row()];
    switch (role) {
    case MainModelRoles::ChildModel:{
        return QVariant::fromValue(item.childModel());
    }
    default: {
        break;
    }
    }
    return QVariant();
}

QHash<int, QByteArray> MainModel::roleNames() const {
    QHash<int, QByteArray> roles;
    roles[MainModelRoles::ChildModel] = "child_model";
    return roles;
}

在 QML 中,您可以将模型角色名称呈现为另一个元素的新模型。例如:

  1. StackLayout这是您的主要元素,包括Repeater.
  2. Repeater模型是MainModel类实例。
  3. Repeater代表包括ListView
  4. ListViewChildModel自己为模型(child_model参考)

因此,您可以在主模型中包含任意数量的不同模型,并将它们作为模型属性公开给 QML。这是你要找的吗?

于 2020-04-06T21:20:16.773 回答