C++/Qt/QAbstractTableModel

Материал из C\C++ эксперт
Перейти к: навигация, поиск

A simple example that shows how selections can be used directly on a model

<source lang="cpp"> /****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the documentation of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • 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 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.0 as published by the Free Software
    • Foundation and appearing in the file LICENSE.GPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /
  1. ifndef MODEL_H
  2. define MODEL_H
  3. include <QAbstractTableModel>
  4. include <QStringList>
  5. include <QVariant>

class TableModel : public QAbstractTableModel {

   Q_OBJECT

public:

   TableModel(int rows = 1, int columns = 1, QObject *parent = 0);
   int rowCount(const QModelIndex &parent = QModelIndex()) const;
   int columnCount(const QModelIndex &parent = QModelIndex()) const;
   QVariant data(const QModelIndex &index, int role) const;
   QVariant headerData(int section, Qt::Orientation orientation,
                       int role = Qt::DisplayRole) const;
   Qt::ItemFlags flags(const QModelIndex &index) const;
   bool setData(const QModelIndex &index, const QVariant &value,
                int role = Qt::EditRole);
   bool insertRows(int position, int rows, const QModelIndex &parent = QModelIndex());
   bool insertColumns(int position, int columns, const QModelIndex &parent = QModelIndex());
   bool removeRows(int position, int rows, const QModelIndex &parent = QModelIndex());
   bool removeColumns(int position, int columns, const QModelIndex &parent = QModelIndex());

private:

   QList<QStringList> rowList;

};

  1. endif



/*

   model.cpp
   Provides a table model for use in various examples.
  • /
  1. include <QtGui>
  2. include "model.h"

/*!

   Constructs a table model with at least one row and one column.
  • /

TableModel::TableModel(int rows, int columns, QObject *parent)

   : QAbstractTableModel(parent)

{

   QStringList newList;
   for (int column = 0; column < qMax(1, columns); ++column) {
       newList.append("");
   }
   for (int row = 0; row < qMax(1, rows); ++row) {
       rowList.append(newList);
   }

}

/*!

   Returns the number of items in the row list as the number of rows
   in the model.
  • /

int TableModel::rowCount(const QModelIndex &/*parent*/) const {

   return rowList.size();

} /*!

   Returns the number of items in the first list item as the number of
   columns in the model. All rows should have the same number of columns.
  • /

int TableModel::columnCount(const QModelIndex &/*parent*/) const {

   return rowList[0].size();

} /*!

   Returns an appropriate value for the requested data.
   If the view requests an invalid index, an invalid variant is returned.
   Any valid index that corresponds to a string in the list causes that
   string to be returned for the display role; otherwise an invalid variant
   is returned.
  • /

QVariant TableModel::data(const QModelIndex &index, int role) const {

   if (!index.isValid())
       return QVariant();
   if (role == Qt::DisplayRole)
       return rowList[index.row()][index.column()];
   else
       return QVariant();

} /*!

   Returns the appropriate header string depending on the orientation of
   the header and the section. If anything other than the display role is
   requested, we return an invalid variant.
  • /

QVariant TableModel::headerData(int section, Qt::Orientation orientation,

                               int role) const

{

   if (role != Qt::DisplayRole)
       return QVariant();
   if (orientation == Qt::Horizontal)
       return QString("Column %1").arg(section);
   else
       return QString("Row %1").arg(section);

} /*!

   Returns an appropriate value for the item"s flags. Valid items are
   enabled, selectable, and editable.
  • /

Qt::ItemFlags TableModel::flags(const QModelIndex &index) const {

   if (!index.isValid())
       return Qt::ItemIsEnabled;
   return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;

} /*!

   Changes an item in the model, but only if the following conditions
   are met:
   * The index supplied is valid.
   * The role associated with editing text is specified.
   The dataChanged() signal is emitted if the item is changed.
  • /

bool TableModel::setData(const QModelIndex &index,

                        const QVariant &value, int role)

{

   if (!index.isValid() || role != Qt::EditRole)
       return false;
   rowList[index.row()][index.column()] = value.toString();
   emit dataChanged(index, index);
   return true;

} /*!

   Inserts a number of rows into the model at the specified position.
  • /

bool TableModel::insertRows(int position, int rows, const QModelIndex &parent) {

   int columns = columnCount();
   beginInsertRows(parent, position, position + rows - 1);
   for (int row = 0; row < rows; ++row) {
       QStringList items;
       for (int column = 0; column < columns; ++column)
           items.append("");
       rowList.insert(position, items);
   }
   endInsertRows();
   return true;

} /*!

   Inserts a number of columns into the model at the specified position.
   Each entry in the list is extended in turn with the required number of
   empty strings.
  • /

bool TableModel::insertColumns(int position, int columns,

                              const QModelIndex &parent)

{

   int rows = rowCount();
   beginInsertColumns(parent, position, position + columns - 1);
   for (int row = 0; row < rows; ++row) {
       for (int column = position; column < columns; ++column) {
           rowList[row].insert(position, "");
       }
   }
   endInsertColumns();
   return true;

} /*!

   Removes a number of rows from the model at the specified position.
  • /

bool TableModel::removeRows(int position, int rows, const QModelIndex &parent) {

   beginRemoveRows(parent, position, position + rows - 1);
   for (int row = 0; row < rows; ++row) {
       rowList.removeAt(position);
   }
   endRemoveRows();
   return true;

} /*!

   Removes a number of columns from the model at the specified position.
   Each row is shortened by the number of columns specified.
  • /

bool TableModel::removeColumns(int position, int columns,

                              const QModelIndex &parent)

{

   int rows = rowCount();
   beginRemoveColumns(parent, position, position + columns - 1);
   for (int row = 0; row < rows; ++row) {
       for (int column = 0; column < columns; ++column) {
           rowList[row].removeAt(position);
       }
   }
   endRemoveColumns();
   return true;

}



/*

 main.cpp
 A simple example that shows how selections can be used directly on a model.
 It shows the result of some selections made using a table view.
  • /
  1. include <QApplication>
  2. include <QItemSelection>
  3. include <QItemSelectionModel>
  4. include <QTableView>
  5. include "model.h"

int main(int argc, char *argv[]) {

   QApplication app(argc, argv);
   TableModel *model = new TableModel(8, 4, &app);
   QTableView *table = new QTableView(0);
   table->setModel(model);
   QItemSelectionModel *selectionModel = table->selectionModel();

   QModelIndex topLeft;
   QModelIndex bottomRight;
   topLeft = model->index(0, 0, QModelIndex());
   bottomRight = model->index(5, 2, QModelIndex());
   QItemSelection selection(topLeft, bottomRight);
   selectionModel->select(selection, QItemSelectionModel::Select);
   QItemSelection toggleSelection;
   topLeft = model->index(2, 1, QModelIndex());
   bottomRight = model->index(7, 3, QModelIndex());
   toggleSelection.select(topLeft, bottomRight);
   selectionModel->select(toggleSelection, QItemSelectionModel::Toggle);
   QItemSelection columnSelection;
   topLeft = model->index(0, 1, QModelIndex());
   bottomRight = model->index(0, 2, QModelIndex());
   columnSelection.select(topLeft, bottomRight);
   selectionModel->select(columnSelection,
       QItemSelectionModel::Select | QItemSelectionModel::Columns);
   QItemSelection rowSelection;
   topLeft = model->index(0, 0, QModelIndex());
   bottomRight = model->index(1, 0, QModelIndex());
   rowSelection.select(topLeft, bottomRight);
   selectionModel->select(rowSelection,
       QItemSelectionModel::Select | QItemSelectionModel::Rows);
   table->setWindowTitle("Selected items in a table model");
   table->show();
   table->resize(460, 280);
   return app.exec();

}


 </source>


A single model can be shared between multiple views

<source lang="cpp"> /****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the documentation of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • 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 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.0 as published by the Free Software
    • Foundation and appearing in the file LICENSE.GPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /
  1. ifndef MODEL_H
  2. define MODEL_H
  3. include <QAbstractTableModel>
  4. include <QStringList>
  5. include <QVariant>

class TableModel : public QAbstractTableModel {

   Q_OBJECT

public:

   TableModel(int rows = 1, int columns = 1, QObject *parent = 0);
   int rowCount(const QModelIndex &parent = QModelIndex()) const;
   int columnCount(const QModelIndex &parent = QModelIndex()) const;
   QVariant data(const QModelIndex &index, int role) const;
   QVariant headerData(int section, Qt::Orientation orientation,
                       int role = Qt::DisplayRole) const;
   Qt::ItemFlags flags(const QModelIndex &index) const;
   bool setData(const QModelIndex &index, const QVariant &value,
                int role = Qt::EditRole);
   bool insertRows(int position, int rows, const QModelIndex &parent = QModelIndex());
   bool insertColumns(int position, int columns, const QModelIndex &parent = QModelIndex());
   bool removeRows(int position, int rows, const QModelIndex &parent = QModelIndex());
   bool removeColumns(int position, int columns, const QModelIndex &parent = QModelIndex());

private:

   QList<QStringList> rowList;

};

  1. endif


/*

   model.cpp
   Provides a table model for use in various examples.
  • /
  1. include <QtGui>
  2. include "model.h"

/*!

   Constructs a table model with at least one row and one column.
  • /

TableModel::TableModel(int rows, int columns, QObject *parent)

   : QAbstractTableModel(parent)

{

   QStringList newList;
   for (int column = 0; column < qMax(1, columns); ++column) {
       newList.append("");
   }
   for (int row = 0; row < qMax(1, rows); ++row) {
       rowList.append(newList);
   }

}

/*!

   Returns the number of items in the row list as the number of rows
   in the model.
  • /

int TableModel::rowCount(const QModelIndex &/*parent*/) const {

   return rowList.size();

} /*!

   Returns the number of items in the first list item as the number of
   columns in the model. All rows should have the same number of columns.
  • /

int TableModel::columnCount(const QModelIndex &/*parent*/) const {

   return rowList[0].size();

} /*!

   Returns an appropriate value for the requested data.
   If the view requests an invalid index, an invalid variant is returned.
   Any valid index that corresponds to a string in the list causes that
   string to be returned for the display role; otherwise an invalid variant
   is returned.
  • /

QVariant TableModel::data(const QModelIndex &index, int role) const {

   if (!index.isValid())
       return QVariant();
   if (role == Qt::DisplayRole)
       return rowList[index.row()][index.column()];
   else
       return QVariant();

} /*!

   Returns the appropriate header string depending on the orientation of
   the header and the section. If anything other than the display role is
   requested, we return an invalid variant.
  • /

QVariant TableModel::headerData(int section, Qt::Orientation orientation,

                               int role) const

{

   if (role != Qt::DisplayRole)
       return QVariant();
   if (orientation == Qt::Horizontal)
       return QString("Column %1").arg(section);
   else
       return QString("Row %1").arg(section);

} /*!

   Returns an appropriate value for the item"s flags. Valid items are
   enabled, selectable, and editable.
  • /

Qt::ItemFlags TableModel::flags(const QModelIndex &index) const {

   if (!index.isValid())
       return Qt::ItemIsEnabled;
   return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;

} /*!

   Changes an item in the model, but only if the following conditions
   are met:
   * The index supplied is valid.
   * The role associated with editing text is specified.
   The dataChanged() signal is emitted if the item is changed.
  • /

bool TableModel::setData(const QModelIndex &index,

                        const QVariant &value, int role)

{

   if (!index.isValid() || role != Qt::EditRole)
       return false;
   rowList[index.row()][index.column()] = value.toString();
   emit dataChanged(index, index);
   return true;

} /*!

   Inserts a number of rows into the model at the specified position.
  • /

bool TableModel::insertRows(int position, int rows, const QModelIndex &parent) {

   int columns = columnCount();
   beginInsertRows(parent, position, position + rows - 1);
   for (int row = 0; row < rows; ++row) {
       QStringList items;
       for (int column = 0; column < columns; ++column)
           items.append("");
       rowList.insert(position, items);
   }
   endInsertRows();
   return true;

} /*!

   Inserts a number of columns into the model at the specified position.
   Each entry in the list is extended in turn with the required number of
   empty strings.
  • /

bool TableModel::insertColumns(int position, int columns, const QModelIndex &parent) {

   int rows = rowCount();
   beginInsertColumns(parent, position, position + columns - 1);
   for (int row = 0; row < rows; ++row) {
       for (int column = position; column < columns; ++column) {
           rowList[row].insert(position, "");
       }
   }
   endInsertColumns();
   return true;

} /*!

   Removes a number of rows from the model at the specified position.
  • /

bool TableModel::removeRows(int position, int rows, const QModelIndex &parent) {

   beginRemoveRows(parent, position, position + rows - 1);
   for (int row = 0; row < rows; ++row) {
       rowList.removeAt(position);
   }
   endRemoveRows();
   return true;

} /*!

   Removes a number of columns from the model at the specified position.
   Each row is shortened by the number of columns specified.
  • /

bool TableModel::removeColumns(int position, int columns, const QModelIndex &parent) {

   int rows = rowCount();
   beginRemoveColumns(parent, position, position + columns - 1);
   for (int row = 0; row < rows; ++row) {
       for (int column = 0; column < columns; ++column) {
           rowList[row].removeAt(position);
       }
   }
   endRemoveColumns();
   return true;

}


/*

 main.cpp
 A simple example that shows how a single model can be shared between
 multiple views.
  • /
  1. include <QApplication>
  2. include <QHeaderView>
  3. include <QItemSelectionModel>
  4. include <QTableView>
  5. include "model.h"

int main(int argc, char *argv[]) {

   QApplication app(argc, argv);
   TableModel *model = new TableModel(4, 2, &app);
   QTableView *firstTableView = new QTableView;
   QTableView *secondTableView = new QTableView;
   firstTableView->setModel(model);
   secondTableView->setModel(model);
   firstTableView->horizontalHeader()->setModel(model);
   for (int row = 0; row < 4; ++row) {
       for (int column = 0; column < 2; ++column) {
           QModelIndex index = model->index(row, column, QModelIndex());
           model->setData(index, QVariant(QString("(%1, %2)").arg(row).arg(column)));
       }
   }
   secondTableView->setSelectionModel(firstTableView->selectionModel());
   firstTableView->setWindowTitle("First table view");
   secondTableView->setWindowTitle("Second table view");
   firstTableView->show();
   secondTableView->show();
   return app.exec();

}


 </source>


how selections can be used directly on a model

<source lang="cpp"> /****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the documentation of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • 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 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.0 as published by the Free Software
    • Foundation and appearing in the file LICENSE.GPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /
  1. ifndef MODEL_H
  2. define MODEL_H
  3. include <QAbstractTableModel>
  4. include <QStringList>
  5. include <QVariant>

class TableModel : public QAbstractTableModel {

   Q_OBJECT

public:

   TableModel(int rows = 1, int columns = 1, QObject *parent = 0);
   int rowCount(const QModelIndex &parent = QModelIndex()) const;
   int columnCount(const QModelIndex &parent = QModelIndex()) const;
   QVariant data(const QModelIndex &index, int role) const;
   QVariant headerData(int section, Qt::Orientation orientation,
                       int role = Qt::DisplayRole) const;
   Qt::ItemFlags flags(const QModelIndex &index) const;
   bool setData(const QModelIndex &index, const QVariant &value,
                int role = Qt::EditRole);
   bool insertRows(int position, int rows, const QModelIndex &parent = QModelIndex());
   bool insertColumns(int position, int columns, const QModelIndex &parent = QModelIndex());
   bool removeRows(int position, int rows, const QModelIndex &parent = QModelIndex());
   bool removeColumns(int position, int columns, const QModelIndex &parent = QModelIndex());

private:

   QList<QStringList> rowList;

};

  1. endif


/*

   model.cpp
   Provides a table model for use in various examples.
  • /
  1. include <QtGui>
  2. include "model.h"

/*!

   Constructs a table model with at least one row and one column.
  • /

TableModel::TableModel(int rows, int columns, QObject *parent)

   : QAbstractTableModel(parent)

{

   QStringList newList;
   for (int column = 0; column < qMax(1, columns); ++column) {
       newList.append("");
   }
   for (int row = 0; row < qMax(1, rows); ++row) {
       rowList.append(newList);
   }

}

/*!

   Returns the number of items in the row list as the number of rows
   in the model.
  • /

int TableModel::rowCount(const QModelIndex &/*parent*/) const {

   return rowList.size();

} /*!

   Returns the number of items in the first list item as the number of
   columns in the model. All rows should have the same number of columns.
  • /

int TableModel::columnCount(const QModelIndex &/*parent*/) const {

   return rowList[0].size();

} /*!

   Returns an appropriate value for the requested data.
   If the view requests an invalid index, an invalid variant is returned.
   Any valid index that corresponds to a string in the list causes that
   string to be returned for the display role; otherwise an invalid variant
   is returned.
  • /

QVariant TableModel::data(const QModelIndex &index, int role) const {

   if (!index.isValid())
       return QVariant();
   if (role == Qt::DisplayRole)
       return rowList[index.row()][index.column()];
   else
       return QVariant();

} /*!

   Returns the appropriate header string depending on the orientation of
   the header and the section. If anything other than the display role is
   requested, we return an invalid variant.
  • /

QVariant TableModel::headerData(int section, Qt::Orientation orientation,

                               int role) const

{

   if (role != Qt::DisplayRole)
       return QVariant();
   if (orientation == Qt::Horizontal)
       return QString("Column %1").arg(section);
   else
       return QString("Row %1").arg(section);

} /*!

   Returns an appropriate value for the item"s flags. Valid items are
   enabled, selectable, and editable.
  • /

Qt::ItemFlags TableModel::flags(const QModelIndex &index) const {

   if (!index.isValid())
       return Qt::ItemIsEnabled;
   return Qt::ItemIsEnabled | Qt::ItemIsSelectable;

} /*!

   Changes an item in the model, but only if the following conditions
   are met:
   * The index supplied is valid.
   * The role associated with editing text is specified.
   The dataChanged() signal is emitted if the item is changed.
  • /

bool TableModel::setData(const QModelIndex &index,

                        const QVariant &value, int role)

{

   if (!index.isValid() || role != Qt::EditRole)
       return false;
   rowList[index.row()][index.column()] = value.toString();
   emit dataChanged(index, index);
   return true;

} /*!

   Inserts a number of rows into the model at the specified position.
  • /

bool TableModel::insertRows(int position, int rows, const QModelIndex &parent) {

   int columns = columnCount();
   beginInsertRows(parent, position, position + rows - 1);
   for (int row = 0; row < rows; ++row) {
       QStringList items;
       for (int column = 0; column < columns; ++column)
           items.append("");
       rowList.insert(position, items);
   }
   endInsertRows();
   return true;

} /*!

   Inserts a number of columns into the model at the specified position.
   Each entry in the list is extended in turn with the required number of
   empty strings.
  • /

bool TableModel::insertColumns(int position, int columns,

                              const QModelIndex &parent)

{

   int rows = rowCount();
   beginInsertColumns(parent, position, position + columns - 1);
   for (int row = 0; row < rows; ++row) {
       for (int column = position; column < columns; ++column) {
           rowList[row].insert(position, "");
       }
   }
   endInsertColumns();
   return true;

} /*!

   Removes a number of rows from the model at the specified position.
  • /

bool TableModel::removeRows(int position, int rows, const QModelIndex &parent) {

   beginRemoveRows(parent, position, position + rows - 1);
   for (int row = 0; row < rows; ++row) {
       rowList.removeAt(position);
   }
   endRemoveRows();
   return true;

} /*!

   Removes a number of columns from the model at the specified position.
   Each row is shortened by the number of columns specified.
  • /

bool TableModel::removeColumns(int position, int columns,

                              const QModelIndex &parent)

{

   int rows = rowCount();
   beginRemoveColumns(parent, position, position + columns - 1);
   for (int row = 0; row < rows; ++row) {
       for (int column = 0; column < columns; ++column) {
           rowList[row].removeAt(position);
       }
   }
   endRemoveColumns();
   return true;

}

  1. ifndef WINDOW_H
  2. define WINDOW_H
  3. include <QItemSelection>
  4. include <QMainWindow>
  5. include <QAbstractItemModel>
  6. include <QWidget>
  7. include <QTableView>

class MainWindow : public QMainWindow {

   Q_OBJECT

public:

   MainWindow(QWidget *parent = 0);

private slots:

   void fillSelection();
   void clearSelection();
   void selectAll();

private:

   QAbstractItemModel *model;
   QItemSelectionModel *selectionModel;
   QTableView *table;

};

  1. endif


/*

 window.cpp
 A minimal subclass of QTableView with slots to allow the selection model
 to be monitored.
  • /
  1. include <QAbstractItemModel>
  2. include <QItemSelection>
  3. include <QItemSelectionModel>
  4. include <QMenu>
  5. include <QMenuBar>
  6. include <QStatusBar>
  7. include "model.h"
  8. include "window.h"

MainWindow::MainWindow(QWidget *parent)

   : QMainWindow(parent)

{

   setWindowTitle("Selected Items in a Table Model");
   model = new TableModel(8, 4, this);
   table = new QTableView(this);
   table->setModel(model);
   QMenu *actionMenu = new QMenu(tr("&Actions"), this);
   QAction *fillAction = actionMenu->addAction(tr("&Fill Selection"));
   QAction *clearAction = actionMenu->addAction(tr("&Clear Selection"));
   QAction *selectAllAction = actionMenu->addAction(tr("&Select All"));
   menuBar()->addMenu(actionMenu);
   connect(fillAction, SIGNAL(triggered()), this, SLOT(fillSelection()));
   connect(clearAction, SIGNAL(triggered()), this, SLOT(clearSelection()));
   connect(selectAllAction, SIGNAL(triggered()), this, SLOT(selectAll()));
   selectionModel = table->selectionModel();
   statusBar();
   setCentralWidget(table);

} void MainWindow::fillSelection() {

   QModelIndexList indexes = selectionModel->selectedIndexes();
   QModelIndex index;
   foreach(index, indexes) {
       QString text = QString("(%1,%2)").arg(index.row()).arg(index.column());
       model->setData(index, text);
   }

} void MainWindow::clearSelection() {

   QModelIndexList indexes = selectionModel->selectedIndexes();
   QModelIndex index;
   foreach(index, indexes)
       model->setData(index, "");

} void MainWindow::selectAll() {

   QModelIndex parent = QModelIndex();

   QModelIndex topLeft = model->index(0, 0, parent);
   QModelIndex bottomRight = model->index(model->rowCount(parent)-1,
       model->columnCount(parent)-1, parent);
   QItemSelection selection(topLeft, bottomRight);
   selectionModel->select(selection, QItemSelectionModel::Select);

}


/*

 main.cpp
 A simple example that shows how selections can be used directly on a model.
 It shows the result of some selections made using a table view.
  • /
  1. include <QApplication>
  2. include "window.h"

int main(int argc, char *argv[]) {

   QApplication app(argc, argv);
   QMainWindow *window = new MainWindow;
   window->show();
   window->resize(640, 480);
   return app.exec();

}


 </source>