zoukankan      html  css  js  c++  java
  • qt_ 通讯录(mail list)

    简单的分析了一个项目: 不懂的地方放在了下面,以后载慢慢看。
     view:
    class adddialog: 一个获得数据的窗口

    calss newaddresstab: 一个空白标签,首界面 有一个信号可以添加数据。点击按钮弹出dilog窗口,获得数据,把信号带数据发送出去

    class mainvindows:

    model:
    class tablemodel: 表格模型,提供接口,包含数据列表,提供接口
    cotrol:
    class addresswidget: 文件读取和保存数据的功能,增删该功能。表格模型的指针,首标签,排序和过滤。
    对外提供接口
    QT_BEGIN_NAMESPACE
    class QSortFilterProxyModel;
    class QItemSelectionModel;
    QT_END_NAMESPACE

    // information about selected items in a model.
    #include <QItemSelection>
    //a stack of tabbed widgets.
    #include <QTabWidget>
    // a abstract model of table
    #include <QAbstractTableModel>
    #include <QtWidgets>


    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);
            // regular expression
            QString regExp = QString("^[%1].*").arg(str);
    
    
            proxyModel = new QSortFilterProxyModel(this);
            //model提供在其他的model和view之间排序和过滤数据
            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);
            //when modef change
            connect(tableView->selectionModel(),
                &QItemSelectionModel::selectionChanged,
                this, &AddressWidget::selectionChanged);
    
    
            connect(this, &QTabWidget::currentChanged, this, [this](int tabIndex) {
                auto *tableView = qobject_cast<QTableView *>(widget(tabIndex));
                if (tableView)
                    emit selectionChanged(tableView->selectionModel()->selection());
            });
            //tavble view
            addTab(tableView, str);
        }
    }
    void AddressWidget::removeEntry()
    {   // point  current table view
        QTableView *temp = static_cast<QTableView*>(currentWidget());
        //sort
        QSortFilterProxyModel *proxy = static_cast<QSortFilterProxyModel*>(temp->model());
        //item select
        QItemSelectionModel *selectionModel = temp->selectionModel();
           //indexs
        QModelIndexList indexes = selectionModel->selectedRows();
          //提供在其他的model和view之间排序和过滤数据
        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");
        }


    /****************************************************************************
    **
    ** Copyright (C) 2016 The Qt Company Ltd.
    ** Contact: https://www.qt.io/licensing/
    **
    ** This file is part of the examples of the Qt Toolkit.
    **
    ** $QT_BEGIN_LICENSE:BSD$
    ** 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 https://www.qt.io/terms-conditions. For further
    ** information use the contact form at https://www.qt.io/contact-us.
    **
    ** BSD License Usage
    ** Alternatively, 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 "tablemodel.h"
    
    
    //! [0]
    TableModel::TableModel(QObject *parent)
        : QAbstractTableModel(parent)
    {
    }
    
    
    TableModel::TableModel(QList<Contact> contacts, QObject *parent)
        : QAbstractTableModel(parent)
        , contacts(contacts)
    {
    }
    //! [0]
    
    
    //! [1]
    int TableModel::rowCount(const QModelIndex &parent) const
    {
        Q_UNUSED(parent);
        return contacts.size();
    }
    
    
    int TableModel::columnCount(const QModelIndex &parent) const
    {
        Q_UNUSED(parent);
        return 2;
    }
    //! [1]
    
    
    //! [2]
    QVariant TableModel::data(const QModelIndex &index, int role) const
    {
        if (!index.isValid())
            return QVariant();
    
    
        if (index.row() >= contacts.size() || index.row() < 0)
            return QVariant();
    
    
        if (role == Qt::DisplayRole) {
            const auto &contact = contacts.at(index.row());
    
    
            if (index.column() == 0)
                return contact.name;
            else if (index.column() == 1)
                return contact.address;
        }
        return QVariant();
    }
    //! [2]
    
    
    //! [3]
    QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const
    {
        if (role != Qt::DisplayRole)
            return QVariant();
    
    
        if (orientation == Qt::Horizontal) {
            switch (section) {
                case 0:
                    return tr("Name");
    
    
                case 1:
                    return tr("Address");
    
    
                default:
                    return QVariant();
            }
        }
        return QVariant();
    }
    //! [3]
    
    
    //! [4]
    bool TableModel::insertRows(int position, int rows, const QModelIndex &index)
    {
        Q_UNUSED(index);
        beginInsertRows(QModelIndex(), position, position + rows - 1);
    
    
        for (int row = 0; row < rows; ++row)
            contacts.insert(position, { QString(), QString() });
    
    
        endInsertRows();
        return true;
    }
    //! [4]
    
    
    //! [5]
    bool TableModel::removeRows(int position, int rows, const QModelIndex &index)
    {
        Q_UNUSED(index);
        beginRemoveRows(QModelIndex(), position, position + rows - 1);
    
    
        for (int row = 0; row < rows; ++row)
            contacts.removeAt(position);
    
    
        endRemoveRows();
        return true;
    }
    //! [5]
    
    
    //! [6]
    bool TableModel::setData(const QModelIndex &index, const QVariant &value, int role)
    {
        if (index.isValid() && role == Qt::EditRole) {
            int row = index.row();
    
    
            auto contact = contacts.value(row);
    
    
            if (index.column() == 0)
                contact.name = value.toString();
            else if (index.column() == 1)
                contact.address = value.toString();
            else
                return false;
    
    
            contacts.replace(row, contact);
            emit(dataChanged(index, index));
    
    
            return true;
        }
    
    
        return false;
    }
    //! [6]
    
    
    //! [7]
    Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
    {
        if (!index.isValid())
            return Qt::ItemIsEnabled;
    
    
        return QAbstractTableModel::flags(index) | Qt::ItemIsEditable;
    }
    //! [7]
    
    
    //! [8]
    QList<Contact> TableModel::getContacts() const
    {
        return contacts;
    }
    //! [8]

    }



  • 相关阅读:
    HTTP协议 (二) 基本认证
    HTTP协议详解
    Wireshark基本介绍和学习TCP三次握手
    Fiddler 教程
    UNIX网络编程——线程池模式比较(ICE线程池模型和L/F领导者跟随者模式)
    修改一行SQL代码 性能提升了100倍
    修改一行SQL代码 性能提升了100倍
    vector map 多层嵌套使用
    vector map 多层嵌套使用
    应该记住的话
  • 原文地址:https://www.cnblogs.com/countryboy666/p/11040384.html
Copyright © 2011-2022 走看看