![](/img/trans.png)
[英]What are the principles involved for an Hierarchical State Machine, and how to implement a basic 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
中存儲指向您的group
和sample
對象的指針
改編這個例子,你會得到
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.