doc/src/snippets/updating-selections/model.cpp
changeset 0 1918ee327afb
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the documentation of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 /*
       
    43     model.cpp
       
    44 
       
    45     Provides a table model for use in various examples.
       
    46 */
       
    47 
       
    48 #include <QtGui>
       
    49 
       
    50 #include "model.h"
       
    51 
       
    52 /*!
       
    53     Constructs a table model with at least one row and one column.
       
    54 */
       
    55 
       
    56 TableModel::TableModel(int rows, int columns, QObject *parent)
       
    57     : QAbstractTableModel(parent)
       
    58 {
       
    59     QStringList newList;
       
    60 
       
    61     for (int column = 0; column < qMax(1, columns); ++column) {
       
    62         newList.append("");
       
    63     }
       
    64 
       
    65     for (int row = 0; row < qMax(1, rows); ++row) {
       
    66         rowList.append(newList);
       
    67     }
       
    68 }
       
    69 
       
    70 
       
    71 /*!
       
    72     Returns the number of items in the row list as the number of rows
       
    73     in the model.
       
    74 */
       
    75 
       
    76 int TableModel::rowCount(const QModelIndex &/*parent*/) const
       
    77 {
       
    78     return rowList.size();
       
    79 }
       
    80 
       
    81 /*!
       
    82     Returns the number of items in the first list item as the number of
       
    83     columns in the model. All rows should have the same number of columns.
       
    84 */
       
    85 
       
    86 int TableModel::columnCount(const QModelIndex &/*parent*/) const
       
    87 {
       
    88     return rowList[0].size();
       
    89 }
       
    90 
       
    91 /*!
       
    92     Returns an appropriate value for the requested data.
       
    93     If the view requests an invalid index, an invalid variant is returned.
       
    94     Any valid index that corresponds to a string in the list causes that
       
    95     string to be returned for the display role; otherwise an invalid variant
       
    96     is returned.
       
    97 */
       
    98 
       
    99 QVariant TableModel::data(const QModelIndex &index, int role) const
       
   100 {
       
   101     if (!index.isValid())
       
   102         return QVariant();
       
   103 
       
   104     if (role == Qt::DisplayRole)
       
   105         return rowList[index.row()][index.column()];
       
   106     else
       
   107         return QVariant();
       
   108 }
       
   109 
       
   110 /*!
       
   111     Returns the appropriate header string depending on the orientation of
       
   112     the header and the section. If anything other than the display role is
       
   113     requested, we return an invalid variant.
       
   114 */
       
   115 
       
   116 QVariant TableModel::headerData(int section, Qt::Orientation orientation,
       
   117                                 int role) const
       
   118 {
       
   119     if (role != Qt::DisplayRole)
       
   120         return QVariant();
       
   121 
       
   122     if (orientation == Qt::Horizontal)
       
   123         return QString("Column %1").arg(section);
       
   124     else
       
   125         return QString("Row %1").arg(section);
       
   126 }
       
   127 
       
   128 /*!
       
   129     Returns an appropriate value for the item's flags. Valid items are
       
   130     enabled, selectable, and editable.
       
   131 */
       
   132 
       
   133 Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
       
   134 {
       
   135     if (!index.isValid())
       
   136         return Qt::ItemIsEnabled;
       
   137 
       
   138     return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
       
   139 }
       
   140 
       
   141 /*!
       
   142     Changes an item in the model, but only if the following conditions
       
   143     are met:
       
   144 
       
   145     * The index supplied is valid.
       
   146     * The role associated with editing text is specified.
       
   147 
       
   148     The dataChanged() signal is emitted if the item is changed.
       
   149 */
       
   150 
       
   151 bool TableModel::setData(const QModelIndex &index,
       
   152                          const QVariant &value, int role)
       
   153 {
       
   154     if (!index.isValid() || role != Qt::EditRole)
       
   155         return false;
       
   156 
       
   157     rowList[index.row()][index.column()] = value.toString();
       
   158     emit dataChanged(index, index);
       
   159     return true;
       
   160 }
       
   161 
       
   162 /*!
       
   163     Inserts a number of rows into the model at the specified position.
       
   164 */
       
   165 
       
   166 bool TableModel::insertRows(int position, int rows, const QModelIndex &parent)
       
   167 {
       
   168     int columns = columnCount();
       
   169     beginInsertRows(parent, position, position + rows - 1);
       
   170 
       
   171     for (int row = 0; row < rows; ++row) {
       
   172         QStringList items;
       
   173         for (int column = 0; column < columns; ++column)
       
   174             items.append("");
       
   175         rowList.insert(position, items);
       
   176     }
       
   177 
       
   178     endInsertRows();
       
   179     return true;
       
   180 }
       
   181 
       
   182 /*!
       
   183     Inserts a number of columns into the model at the specified position.
       
   184     Each entry in the list is extended in turn with the required number of
       
   185     empty strings.
       
   186 */
       
   187 
       
   188 bool TableModel::insertColumns(int position, int columns, const QModelIndex &parent)
       
   189 {
       
   190     int rows = rowCount();
       
   191     beginInsertColumns(parent, position, position + columns - 1);
       
   192 
       
   193     for (int row = 0; row < rows; ++row) {
       
   194         for (int column = position; column < columns; ++column) {
       
   195             rowList[row].insert(position, "");
       
   196         }
       
   197     }
       
   198 
       
   199     endInsertColumns();
       
   200     return true;
       
   201 }
       
   202 
       
   203 /*!
       
   204     Removes a number of rows from the model at the specified position.
       
   205 */
       
   206 
       
   207 bool TableModel::removeRows(int position, int rows, const QModelIndex &parent)
       
   208 {
       
   209     beginRemoveRows(parent, position, position + rows - 1);
       
   210 
       
   211     for (int row = 0; row < rows; ++row) {
       
   212         rowList.removeAt(position);
       
   213     }
       
   214 
       
   215     endRemoveRows();
       
   216     return true;
       
   217 }
       
   218 
       
   219 /*!
       
   220     Removes a number of columns from the model at the specified position.
       
   221     Each row is shortened by the number of columns specified.
       
   222 */
       
   223 
       
   224 bool TableModel::removeColumns(int position, int columns, const QModelIndex &parent)
       
   225 {
       
   226     int rows = rowCount();
       
   227     beginRemoveColumns(parent, position, position + columns - 1);
       
   228 
       
   229     for (int row = 0; row < rows; ++row) {
       
   230         for (int column = 0; column < columns; ++column) {
       
   231             rowList[row].removeAt(position);
       
   232         }
       
   233     }
       
   234 
       
   235     endRemoveColumns();
       
   236     return true;
       
   237 }