- Qt 5.5
- Qt Widgets
- Spreadsheet
- spreadsheetdelegate.cpp Example File
- Qt 5.5.1 Reference Documentation

# spreadsheetdelegate.cpp Example File

itemviews/spreadsheet/spreadsheetdelegate.cpp

    /****************************************************************************
    **
    ** Copyright (C) 2015 The Qt Company Ltd.
    ** Contact: http://www.qt.io/licensing/
    **
    ** This file is part of the demonstration applications of the Qt Toolkit.
    **
    ** $QT_BEGIN_LICENSE:LGPL21$
    ** Commercial License Usage
    ** Licensees holding valid commercial Qt licenses may use this file in
    ** accordance with the commercial license agreement provided with the
    ** Software or, alternatively, in accordance with the terms contained in
    ** a written agreement between you and The Qt Company. For licensing terms
    ** and conditions see http://www.qt.io/terms-conditions. For further
    ** information use the contact form at http://www.qt.io/contact-us.
    **
    ** GNU Lesser General Public License Usage
    ** Alternatively, this file may be used under the terms of the GNU Lesser
    ** General Public License version 2.1 or version 3 as published by the Free
    ** Software Foundation and appearing in the file LICENSE.LGPLv21 and
    ** LICENSE.LGPLv3 included in the packaging of this file. Please review the
    ** following information to ensure the GNU Lesser General Public License
    ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
    ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    **
    ** As a special exception, The Qt Company gives you certain additional
    ** rights. These rights are described in The Qt Company LGPL Exception
    ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    **
    ** $QT_END_LICENSE$
    **
    ****************************************************************************/

    #include "spreadsheetdelegate.h"

    #include <QtWidgets>

    SpreadSheetDelegate::SpreadSheetDelegate(QObject *parent)
            : QItemDelegate(parent) {}

    QWidget *SpreadSheetDelegate::createEditor(QWidget *parent,
                                              const QStyleOptionViewItem &,
                                              const QModelIndex &index) const
    {
        if (index.column() == 1) {
            QDateTimeEdit *editor = new QDateTimeEdit(parent);
            editor->setDisplayFormat("dd/M/yyyy");
            editor->setCalendarPopup(true);
            return editor;
        }

        QLineEdit *editor = new QLineEdit(parent);

        // create a completer with the strings in the column as model
        QStringList allStrings;
        for (int i = 1; i<index.model()->rowCount(); i++) {
            QString strItem(index.model()->data(index.sibling(i, index.column()),
                Qt::EditRole).toString());

            if (!allStrings.contains(strItem))
                allStrings.append(strItem);
        }

        QCompleter *autoComplete = new QCompleter(allStrings);
        editor->setCompleter(autoComplete);
        connect(editor, SIGNAL(editingFinished()), this, SLOT(commitAndCloseEditor()));
        return editor;
    }

    void SpreadSheetDelegate::commitAndCloseEditor()
    {
        QLineEdit *editor = qobject_cast<QLineEdit *>(sender());
        emit commitData(editor);
        emit closeEditor(editor);
    }

    void SpreadSheetDelegate::setEditorData(QWidget *editor,
        const QModelIndex &index) const
    {
        QLineEdit *edit = qobject_cast<QLineEdit*>(editor);
        if (edit) {
            edit->setText(index.model()->data(index, Qt::EditRole).toString());
            return;
        }

        QDateTimeEdit *dateEditor = qobject_cast<QDateTimeEdit *>(editor);
        if (dateEditor) {
            dateEditor->setDate(QDate::fromString(
                                    index.model()->data(index, Qt::EditRole).toString(),
                                    "d/M/yyyy"));
        }
    }

    void SpreadSheetDelegate::setModelData(QWidget *editor,
        QAbstractItemModel *model, const QModelIndex &index) const
    {
        QLineEdit *edit = qobject_cast<QLineEdit *>(editor);
        if (edit) {
            model->setData(index, edit->text());
            return;
        }

        QDateTimeEdit *dateEditor = qobject_cast<QDateTimeEdit *>(editor);
        if (dateEditor)
            model->setData(index, dateEditor->date().toString("dd/M/yyyy"));
    }