- Qt 5.5
- Qt Widgets
- Address Book Example
- addresswidget.cpp Example File
- Qt 5.5.1 Reference Documentation

# addresswidget.cpp Example File

itemviews/addressbook/addresswidget.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 "adddialog.h"
    #include "addresswidget.h"

    #include <QtWidgets>

    AddressWidget::AddressWidget(QWidget *parent)
        : QTabWidget(parent)
    {
        table = new TableModel(this);
        newAddressTab = new NewAddressTab(this);
        connect(newAddressTab, SIGNAL(sendDetails(QString, QString)),
            this, SLOT(addEntry(QString, QString)));

        addTab(newAddressTab, "Address Book");

        setupTabs();
    }

    void AddressWidget::addEntry()
    {
        AddDialog aDialog;

        if (aDialog.exec()) {
            QString name = aDialog.nameText->text();
            QString address = aDialog.addressText->toPlainText();

            addEntry(name, address);
        }
    }

    void AddressWidget::addEntry(QString name, QString address)
    {
        QList<QPair<QString, QString> >list = table->getList();
        QPair<QString, QString> pair(name, address);

        if (!list.contains(pair)) {
            table->insertRows(0, 1, QModelIndex());

            QModelIndex index = table->index(0, 0, QModelIndex());
            table->setData(index, name, Qt::EditRole);
            index = table->index(0, 1, QModelIndex());
            table->setData(index, address, Qt::EditRole);
            removeTab(indexOf(newAddressTab));
        } else {
            QMessageBox::information(this, tr("Duplicate Name"),
                tr("The name \"%1\" already exists.").arg(name));
        }
    }

    void AddressWidget::editEntry()
    {
        QTableView *temp = static_cast<QTableView*>(currentWidget());
        QSortFilterProxyModel *proxy = static_cast<QSortFilterProxyModel*>(temp->model());
        QItemSelectionModel *selectionModel = temp->selectionModel();

        QModelIndexList indexes = selectionModel->selectedRows();
        QString name;
        QString address;
        int row = -1;

        foreach (QModelIndex index, indexes) {
            row = proxy->mapToSource(index).row();
            QModelIndex nameIndex = table->index(row, 0, QModelIndex());
            QVariant varName = table->data(nameIndex, Qt::DisplayRole);
            name = varName.toString();

            QModelIndex addressIndex = table->index(row, 1, QModelIndex());
            QVariant varAddr = table->data(addressIndex, Qt::DisplayRole);
            address = varAddr.toString();
        }

        AddDialog aDialog;
        aDialog.setWindowTitle(tr("Edit a Contact"));

        aDialog.nameText->setReadOnly(true);
        aDialog.nameText->setText(name);
        aDialog.addressText->setText(address);

        if (aDialog.exec()) {
            QString newAddress = aDialog.addressText->toPlainText();
            if (newAddress != address) {
                QModelIndex index = table->index(row, 1, QModelIndex());
                table->setData(index, newAddress, Qt::EditRole);
            }
        }
    }

    void AddressWidget::removeEntry()
    {
        QTableView *temp = static_cast<QTableView*>(currentWidget());
        QSortFilterProxyModel *proxy = static_cast<QSortFilterProxyModel*>(temp->model());
        QItemSelectionModel *selectionModel = temp->selectionModel();

        QModelIndexList indexes = selectionModel->selectedRows();

        foreach (QModelIndex index, indexes) {
            int row = proxy->mapToSource(index).row();
            table->removeRows(row, 1, QModelIndex());
        }

        if (table->rowCount(QModelIndex()) == 0) {
            insertTab(0, newAddressTab, "Address Book");
        }
    }

    void AddressWidget::setupTabs()
    {
        QStringList groups;
        groups << "ABC" << "DEF" << "GHI" << "JKL" << "MNO" << "PQR" << "STU" << "VW" << "XYZ";

        for (int i = 0; i < groups.size(); ++i) {
            QString str = groups.at(i);
            QString regExp = QString("^[%1].*").arg(str);

            proxyModel = new QSortFilterProxyModel(this);
            proxyModel->setSourceModel(table);
            proxyModel->setFilterRegExp(QRegExp(regExp, Qt::CaseInsensitive));
            proxyModel->setFilterKeyColumn(0);

            QTableView *tableView = new QTableView;
            tableView->setModel(proxyModel);

            tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
            tableView->horizontalHeader()->setStretchLastSection(true);
            tableView->verticalHeader()->hide();
            tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
            tableView->setSelectionMode(QAbstractItemView::SingleSelection);

            tableView->setSortingEnabled(true);

            connect(tableView->selectionModel(),
                SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
                this, SIGNAL(selectionChanged(QItemSelection)));

            addTab(tableView, str);
        }
    }

    void AddressWidget::readFromFile(const QString &fileName)
    {
        QFile file(fileName);

        if (!file.open(QIODevice::ReadOnly)) {
            QMessageBox::information(this, tr("Unable to open file"),
                file.errorString());
            return;
        }

        QList<QPair<QString, QString> > pairs = table->getList();
        QDataStream in(&file);
        in >> pairs;

        if (pairs.isEmpty()) {
            QMessageBox::information(this, tr("No contacts in file"),
                                     tr("The file you are attempting to open contains no contacts."));
        } else {
            for (int i=0; i<pairs.size(); ++i) {
                QPair<QString, QString> p = pairs.at(i);
                addEntry(p.first, p.second);
            }
        }
    }

    void AddressWidget::writeToFile(const QString &fileName)
    {
        QFile file(fileName);

        if (!file.open(QIODevice::WriteOnly)) {
            QMessageBox::information(this, tr("Unable to open file"), file.errorString());
            return;
        }

        QList<QPair<QString, QString> > pairs = table->getList();
        QDataStream out(&file);
        out << pairs;
    }