簡體   English   中英

如何使用 MV 在 Qt model 中實現層次結構?

[英]How to implement a hierarchical structure in a Qt model using MV?

我最近開始學習 Qt 並且正在研究模型。

我有以下分層 model。

struct group{
 QList<sample> samples;
QString name;
}

struct sample{
QString name;
}

有組 - 組列表。 每組有幾個樣本。 這樣就完成了層次結構。

樣本沒有孩子,該組沒有父母。

但是這種層次結構確實給我帶來了問題,我無法使用 qt mv QAbstractItemModel 來實現它,像 TreeView 一樣顯示它。

在樹中,作為根 - 我需要顯示組的名稱,並作為葉 - 特定組的特定選擇。

您可以在QModelIndex::internalPointer中存儲指向您的groupsample對象的指針

改編這個例子,你會得到

class GroupModel : public QAbstractItemModel
{
    Q_OBJECT

public:
    explicit GroupModel(QList<group> groups, QObject *parent = nullptr);

    QVariant data(const QModelIndex &index, int role) const override;
    QVariant headerData(int section, Qt::Orientation orientation,
                        int role = Qt::DisplayRole) const override;
    QModelIndex index(int row, int column,
                      const QModelIndex &parent = QModelIndex()) const override;
    QModelIndex parent(const QModelIndex &index) const override;
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    int columnCount(const QModelIndex &parent = QModelIndex()) const override;

private:

    QList<group> groups;
};

GroupModel::GroupModel(QList<group> groups, QObject *parent)
    : QAbstractItemModel(parent), groups(groups)
{
}

QModelIndex GroupModel::index(int row, int column, const QModelIndex &parent) const
{
    if (!hasIndex(row, column, parent))
        return QModelIndex();

    if (!parent.isValid())
        return createIndex(row, column, &groups[row]);
    if (group * g = static_cast<group *>(parent.internalPointer()))
        return createIndex(row, column, &g->samples[row]);
    return QModelIndex();
}

QModelIndex GroupModel::parent(const QModelIndex &index) const
{
    if (!index.isValid())
        return QModelIndex();

    void * p = index.internalPointer();

    for (int i = 0; i < groups.count; ++i) 
    {
        if (p == &groups[i]) return QModelIndex();
        for (auto & s : groups[i]->samples)
        {
            if (p == &s) return createIndex(i, 0, &groups[i]);
        }
    }

    return QModelIndex();
}

int GroupModel::rowCount(const QModelIndex &parent) const
{
    if (parent.column() > 0)
        return 0;
    else if (!parent.isValid())
        return groups.count()
    else if (group * g = static_cast<group *>(parent.internalPointer()))
        return g->samples.count();
}

int GroupModel::columnCount(const QModelIndex &parent) const
{
    return 1;
}

QVariant GroupModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    if (role != Qt::DisplayRole)
        return QVariant();

    if (!index.parent().isValid())
        return static_cast<group *>(index.internalPointer())->name;

    return static_cast<sample *>(index.internalPointer())->name;
}

QVariant GroupModel::headerData(int section, Qt::Orientation orientation,
                               int role) const
{
    if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
        return "Name";

    return QVariant();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM