- Qt 5.5
- Qt Widgets
- Editable Tree Model Example
- mainwindow.cpp Example File
- Qt 5.5.1 Reference Documentation

# mainwindow.cpp Example File

itemviews/editabletreemodel/mainwindow.cpp

    /****************************************************************************
    **
    ** Copyright (C) 2015 The Qt Company Ltd.
    ** Contact: http://www.qt.io/licensing/
    **
    ** This file is part of the examples of the Qt Toolkit.
    **
    ** $QT_BEGIN_LICENSE:BSD$
    ** You may use this file under the terms of the BSD license as follows:
    **
    ** "Redistribution and use in source and binary forms, with or without
    ** modification, are permitted provided that the following conditions are
    ** met:
    **   * Redistributions of source code must retain the above copyright
    **     notice, this list of conditions and the following disclaimer.
    **   * Redistributions in binary form must reproduce the above copyright
    **     notice, this list of conditions and the following disclaimer in
    **     the documentation and/or other materials provided with the
    **     distribution.
    **   * Neither the name of The Qt Company Ltd nor the names of its
    **     contributors may be used to endorse or promote products derived
    **     from this software without specific prior written permission.
    **
    **
    ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
    **
    ** $QT_END_LICENSE$
    **
    ****************************************************************************/

    #include "mainwindow.h"
    #include "treemodel.h"

    #include <QFile>

    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        setupUi(this);

        QStringList headers;
        headers << tr("Title") << tr("Description");

        QFile file(":/default.txt");
        file.open(QIODevice::ReadOnly);
        TreeModel *model = new TreeModel(headers, file.readAll());
        file.close();

        view->setModel(model);
        for (int column = 0; column < model->columnCount(); ++column)
            view->resizeColumnToContents(column);

        connect(exitAction, SIGNAL(triggered()), qApp, SLOT(quit()));

        connect(view->selectionModel(),
                SIGNAL(selectionChanged(const QItemSelection &,
                                        const QItemSelection &)),
                this, SLOT(updateActions()));

        connect(actionsMenu, SIGNAL(aboutToShow()), this, SLOT(updateActions()));
        connect(insertRowAction, SIGNAL(triggered()), this, SLOT(insertRow()));
        connect(insertColumnAction, SIGNAL(triggered()), this, SLOT(insertColumn()));
        connect(removeRowAction, SIGNAL(triggered()), this, SLOT(removeRow()));
        connect(removeColumnAction, SIGNAL(triggered()), this, SLOT(removeColumn()));
        connect(insertChildAction, SIGNAL(triggered()), this, SLOT(insertChild()));

        updateActions();
    }

    void MainWindow::insertChild()
    {
        QModelIndex index = view->selectionModel()->currentIndex();
        QAbstractItemModel *model = view->model();

        if (model->columnCount(index) == 0) {
            if (!model->insertColumn(0, index))
                return;
        }

        if (!model->insertRow(0, index))
            return;

        for (int column = 0; column < model->columnCount(index); ++column) {
            QModelIndex child = model->index(0, column, index);
            model->setData(child, QVariant("[No data]"), Qt::EditRole);
            if (!model->headerData(column, Qt::Horizontal).isValid())
                model->setHeaderData(column, Qt::Horizontal, QVariant("[No header]"), Qt::EditRole);
        }

        view->selectionModel()->setCurrentIndex(model->index(0, 0, index),
                                                QItemSelectionModel::ClearAndSelect);
        updateActions();
    }

    bool MainWindow::insertColumn(const QModelIndex &parent)
    {
        QAbstractItemModel *model = view->model();
        int column = view->selectionModel()->currentIndex().column();

        // Insert a column in the parent item.
        bool changed = model->insertColumn(column + 1, parent);
        if (changed)
            model->setHeaderData(column + 1, Qt::Horizontal, QVariant("[No header]"), Qt::EditRole);

        updateActions();

        return changed;
    }

    void MainWindow::insertRow()
    {
        QModelIndex index = view->selectionModel()->currentIndex();
        QAbstractItemModel *model = view->model();

        if (!model->insertRow(index.row()+1, index.parent()))
            return;

        updateActions();

        for (int column = 0; column < model->columnCount(index.parent()); ++column) {
            QModelIndex child = model->index(index.row()+1, column, index.parent());
            model->setData(child, QVariant("[No data]"), Qt::EditRole);
        }
    }

    bool MainWindow::removeColumn(const QModelIndex &parent)
    {
        QAbstractItemModel *model = view->model();
        int column = view->selectionModel()->currentIndex().column();

        // Insert columns in each child of the parent item.
        bool changed = model->removeColumn(column, parent);

        if (!parent.isValid() && changed)
            updateActions();

        return changed;
    }

    void MainWindow::removeRow()
    {
        QModelIndex index = view->selectionModel()->currentIndex();
        QAbstractItemModel *model = view->model();
        if (model->removeRow(index.row(), index.parent()))
            updateActions();
    }

    void MainWindow::updateActions()
    {
        bool hasSelection = !view->selectionModel()->selection().isEmpty();
        removeRowAction->setEnabled(hasSelection);
        removeColumnAction->setEnabled(hasSelection);

        bool hasCurrent = view->selectionModel()->currentIndex().isValid();
        insertRowAction->setEnabled(hasCurrent);
        insertColumnAction->setEnabled(hasCurrent);

        if (hasCurrent) {
            view->closePersistentEditor(view->selectionModel()->currentIndex());

            int row = view->selectionModel()->currentIndex().row();
            int column = view->selectionModel()->currentIndex().column();
            if (view->selectionModel()->currentIndex().parent().isValid())
                statusBar()->showMessage(tr("Position: (%1,%2)").arg(row).arg(column));
            else
                statusBar()->showMessage(tr("Position: (%1,%2) in top level").arg(row).arg(column));
        }
    }