Qt отображение корневого элемента дерева

121
19 октября 2019, 19:40

Хочу создать свою модель дерева, получается вот такое:

Как сделать чтобы отображался корневой элемент?

class TreeItem
{
public:
    explicit TreeItem(const QString &data, TreeItem* parent = 0);
    ~TreeItem();
    void appendChild(TreeItem *child);
    void setParent(TreeItem *parent);

    TreeItem *child(int row);
    int childCount() const;
    QString data() const;
    int row() const;
    TreeItem *parentItem();
private:
    QList<TreeItem*> _childItems;
    QString _data;
    TreeItem* _parentItem;
};
class TreeModel : public QAbstractItemModel
{
public:
    explicit TreeModel( const QString &data, QObject *parent = 0 );
    ~TreeModel();
    QVariant data( const QModelIndex &index, int role ) const override;
    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
    Qt::ItemFlags flags( const QModelIndex &index ) 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:
    TreeItem* _rootItem;
};

QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent ) const
{
    qDebug() << "TreeModel::index";
    if ( !hasIndex(row, column, parent) )
        return QModelIndex();
    TreeItem* parentItem;
    if ( !parent.isValid() )
        parentItem = _rootItem;
    else
        parentItem = static_cast<TreeItem*>( parent.internalPointer() );
    TreeItem* childItem = parentItem->child(row);
    if (childItem)
        return createIndex(row, column, childItem);
    else
        return QModelIndex();
}
QModelIndex TreeModel::parent(const QModelIndex &index) const
{
    qDebug() << "TreeModel::parent";
    if (!index.isValid())
        return QModelIndex();
    TreeItem *childItem = static_cast<TreeItem*>(index.internalPointer());
    TreeItem *parentItem = childItem->parentItem();
    if (parentItem == _rootItem)
        return QModelIndex();
    return createIndex(parentItem->row(), 0, parentItem);
}

MainWindow::MainWindow()
{
    mainWindow.setupUi(this);
    TreeModel* model = new TreeModel("abc");
    mainWindow.treeView->setModel(model);
}
Answer 1

Не зря функция для корневого элемента дерева называется invisibleRootItem.

Добавь в свою модель еще один уровень, начиная ветвление только со 2-го уровня, тогда в отображаемой части будт виден один корень.

READ ALSO
Фабричный метод и анонимные классы

Фабричный метод и анонимные классы

Разбираюсь с абстрактными классами в java и в качестве примера их использования приводиться фабричный метод, и говориться что в данном случае...

92
Spring Data JPA закрывается соеденение с БД

Spring Data JPA закрывается соеденение с БД

Имеется Spring boot приложение, которое перегоняет большое количество данных получаемых по API в удаленную БД (MySQL)В качестве пула соединений использую...

126
Сигнатура конструктора в интерфейсе

Сигнатура конструктора в интерфейсе

Почему нельзя в интерфейсе задать сигнатуру конструктора без реализации?

105