C++/Qt/QAbstractListModel

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

extends QAbstractListModel to create file list 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 examples 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 FILELISTMODEL_H
  2. define FILELISTMODEL_H
  3. include <QAbstractListModel>
  4. include <QList>
  5. include <QStringList>

class FileListModel : public QAbstractListModel {

   Q_OBJECT

public:

   FileListModel(QObject *parent = 0);
   int rowCount(const QModelIndex &parent = QModelIndex()) const;
   QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;

signals:

   void numberPopulated(int number);

public slots:

   void setDirPath(const QString &path);

protected:

   bool canFetchMore(const QModelIndex &parent) const;
   void fetchMore(const QModelIndex &parent);

private:

   QStringList fileList;
   int fileCount;

};

  1. endif


/****************************************************************************

    • 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 examples 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. include "filelistmodel.h"
  2. include <QApplication>
  3. include <QPalette>
  4. include <QBrush>
  5. include <QDir>

FileListModel::FileListModel(QObject *parent)

   : QAbstractListModel(parent)

{ }

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

   return fileCount;

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

   if (!index.isValid())
       return QVariant();
   
   if (index.row() >= fileList.size() || index.row() < 0)
       return QVariant();
   
   if (role == Qt::DisplayRole)
       return fileList.at(index.row());
   else if (role == Qt::BackgroundRole) {
       int batch = (index.row() / 100) % 2;
       if (batch == 0)
           return qApp->palette().base();
       else
           return qApp->palette().alternateBase();
   }
   return QVariant();

}

bool FileListModel::canFetchMore(const QModelIndex & /* index */) const {

   if (fileCount < fileList.size())
       return true;
   else
       return false;

}

void FileListModel::fetchMore(const QModelIndex & /* index */) {

   int remainder = fileList.size() - fileCount;
   int itemsToFetch = qMin(100, remainder);
   beginInsertRows(QModelIndex(), fileCount, fileCount+itemsToFetch);
   
   fileCount += itemsToFetch;
   endInsertRows();
   emit numberPopulated(itemsToFetch);

}

void FileListModel::setDirPath(const QString &path) {

   QDir dir(path);
   fileList = dir.entryList();
   fileCount = 0;
   reset();

}


  1. ifndef WINDOW_H
  2. define WINDOW_H
  3. include <QWidget>

QT_BEGIN_NAMESPACE class QTextBrowser; QT_END_NAMESPACE class Window : public QWidget {

   Q_OBJECT

public:

   Window(QWidget *parent = 0);

public slots:

   void updateLog(int number);

private:

   QTextBrowser *logViewer;

};

  1. endif


  1. include <QtGui>
  2. include "filelistmodel.h"
  3. include "window.h"

Window::Window(QWidget *parent)

   : QWidget(parent)

{

   FileListModel *model = new FileListModel(this);
   model->setDirPath(QLibraryInfo::location(QLibraryInfo::PrefixPath));
   QLabel *label = new QLabel(tr("&Directory:"));
   QLineEdit *lineEdit = new QLineEdit;
   label->setBuddy(lineEdit);
   QListView *view = new QListView;
   view->setModel(model);
   logViewer = new QTextBrowser;
   logViewer->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred));
   connect(lineEdit, SIGNAL(textChanged(const QString &)),
           model, SLOT(setDirPath(const QString &)));
   connect(lineEdit, SIGNAL(textChanged(const QString &)),
           logViewer, SLOT(clear()));
   connect(model, SIGNAL(numberPopulated(int)),
           this, SLOT(updateLog(int)));
   
   QGridLayout *layout = new QGridLayout;
   layout->addWidget(label, 0, 0);
   layout->addWidget(lineEdit, 0, 1);
   layout->addWidget(view, 1, 0, 1, 2);
   layout->addWidget(logViewer, 2, 0, 1, 2);
   setLayout(layout);
   setWindowTitle(tr("Fetch More Example"));

} void Window::updateLog(int number) {

   logViewer->append(tr("%1 items added.").arg(number));

}


  1. include <QApplication>
  2. include "window.h"

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

   QApplication app(argc, argv);
   Window window;
   window.show();
   return app.exec();

}


 </source>


persistent indexes

<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 <QAbstractListModel>
  4. include <QObject>
  5. include <QStringList>

class StringListModel : public QAbstractListModel {

   Q_OBJECT

public:

   StringListModel(const QStringList &strings, QObject *parent = 0)
       : QAbstractListModel(parent), stringList(strings) {}
   int rowCount(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 &index = QModelIndex());
   bool removeRows(int position, int rows, const QModelIndex &index = QModelIndex());

private:

   QStringList stringList;

};

  1. endif


/*

 model.cpp
 A simple model that uses a QStringList as its data source.
  • /
  1. include <qdebug.h>
  2. include "model.h"

/*!

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

int StringListModel::rowCount(const QModelIndex &parent) const {

   return stringList.count();

} /*!

   Returns an appropriate value for the requested data.
   If the view requests an invalid index, an invalid variant is returned.
   If a header is requested then we just return the column or row number,
   depending on the orientation of the header.
   Any valid index that corresponds to a string in the list causes that
   string to be returned.
  • /

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

   if (!index.isValid())
       return QVariant();
   if (index.row() < 0 || index.row() >= stringList.size())
       return QVariant();
   if (role == Qt::DisplayRole)
       return stringList.at(index.row());
   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 StringListModel::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 StringListModel::flags(const QModelIndex &index) const {

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

} /*!

   Changes an item in the string list, but only if the following conditions
   are met:
   * The index supplied is valid.
   * The index corresponds to an item to be shown in a view.
   * The role associated with editing text is specified.
   The dataChanged() signal is emitted if the item is changed.
  • /

bool StringListModel::setData(const QModelIndex &index,

                             const QVariant &value, int role)

{

   if (index.isValid() && role == Qt::EditRole) {
       stringList.replace(index.row(), value.toString());
       emit dataChanged(index, index);
       return true;
   }
   return false;

} /*!

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

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

   beginInsertRows(parent, position, position + rows - 1);
   for (int row = 0; row < rows; ++row) {
       stringList.insert(position, "");
   }
   endInsertRows();
   return true;

} /*!

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

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

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

}


  1. ifndef MAINWINDOW_H
  2. define MAINWINDOW_H
  3. include <QMainWindow>
  4. include <QModelIndex>

class QAbstractItemModel; class QAction; class QItemSelectionModel; class MainWindow : public QMainWindow {

   Q_OBJECT

public:

   MainWindow(QWidget *parent = 0);

private slots:

   void insertItem();
   void removeItem();
   void updateMenus(const QModelIndex &currentIndex);

private:

   QAbstractItemModel *model;
   QAction *insertAction;
   QAction *removeAction;
   QItemSelectionModel *selectionModel;

};

  1. endif


  1. include <QtGui>
  2. include "mainwindow.h"
  3. include "model.h"

/*!

   The main window constructor creates and populates a model with values
   from a string list then displays the contents of the model using a
   QListView widget.
  • /

MainWindow::MainWindow(QWidget *parent)

   : QMainWindow(parent)

{

   QMenu *fileMenu = new QMenu(tr("&File"));
   QAction *quitAction = fileMenu->addAction(tr("E&xit"));
   quitAction->setShortcut(tr("Ctrl+Q"));
   QMenu *itemsMenu = new QMenu(tr("&Items"));
   insertAction = itemsMenu->addAction(tr("&Insert Item"));
   removeAction = itemsMenu->addAction(tr("&Remove Item"));
   menuBar()->addMenu(fileMenu);
   menuBar()->addMenu(itemsMenu);
   QStringList numbers;
   numbers << tr("One") << tr("Two") << tr("Three") << tr("Four") << tr("Five")
           << tr("Six") << tr("Seven") << tr("Eight") << tr("Nine") << tr("Ten");
   model = new StringListModel(numbers);
   QListView *view = new QListView(this);
   view->setModel(model);
   selectionModel = view->selectionModel();
   connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
   connect(insertAction, SIGNAL(triggered()), this, SLOT(insertItem()));
   connect(removeAction, SIGNAL(triggered()), this, SLOT(removeItem()));
   connect(selectionModel,
           SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)),
           this, SLOT(updateMenus(const QModelIndex &)));
   
   setCentralWidget(view);
   setWindowTitle("View onto a string list model");

} void MainWindow::insertItem() {

   if (!selectionModel->currentIndex().isValid())
       return;
   QString itemText = QInputDialog::getText(this, tr("Insert Item"),
       tr("Input text for the new item:"));
   if (itemText.isNull())
       return;
   int row = selectionModel->currentIndex().row();
   if (model->insertRows(row, 1))
       model->setData(model->index(row, 0), itemText, Qt::EditRole);

} void MainWindow::removeItem() {

   if (!selectionModel->currentIndex().isValid())
       return;
   int row = selectionModel->currentIndex().row();
   model->removeRows(row, 1);

} void MainWindow::updateMenus(const QModelIndex &currentIndex) {

   insertAction->setEnabled(currentIndex.isValid());
   removeAction->setEnabled(currentIndex.isValid());

}


  1. include <QApplication>
  2. include "mainwindow.h"

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

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

}


 </source>


string list model example

<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 <QAbstractListModel>
  4. include <QObject>
  5. include <QStringList>

class StringListModel : public QAbstractListModel {

   Q_OBJECT

public:

   StringListModel(const QStringList &strings, QObject *parent = 0)
       : QAbstractListModel(parent), stringList(strings) {}
   int rowCount(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 &index = QModelIndex());
   bool removeRows(int position, int rows, const QModelIndex &index = QModelIndex());

private:

   QStringList stringList;

};

  1. endif


/*

 model.cpp
 A simple model that uses a QStringList as its data source.
  • /
  1. include "model.h"

/*!

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

int StringListModel::rowCount(const QModelIndex &parent) const {

   return stringList.count();

}

/*!

   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.
  • /

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

   if (!index.isValid())
       return QVariant();
   if (index.row() >= stringList.size())
       return QVariant();
   if (role == Qt::DisplayRole)
       return stringList.at(index.row());
   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 StringListModel::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 StringListModel::flags(const QModelIndex &index) const {

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

}

/*!

   Changes an item in the string list, but only if the following conditions
   are met:
   * The index supplied is valid.
   * The index corresponds to an item to be shown in a view.
   * The role associated with editing text is specified.
   The dataChanged() signal is emitted if the item is changed.
  • /

bool StringListModel::setData(const QModelIndex &index,

                             const QVariant &value, int role)

{

   if (index.isValid() && role == Qt::EditRole) {
       stringList.replace(index.row(), value.toString());
       emit dataChanged(index, index);
       return true;
   }

   return false;

}

/*!

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

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

   beginInsertRows(QModelIndex(), position, position+rows-1);
   for (int row = 0; row < rows; ++row) {
       stringList.insert(position, "");
   }
   endInsertRows();
   return true;

}

/*!

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

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

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

}


/*!

   The main function for the string list model example. This creates and
   populates a model with values from a string list then displays the
   contents of the model using a QListView widget.
  • /
  1. include <QAbstractItemModel>
  2. include <QApplication>
  3. include <QListView>
  4. include "model.h"

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

   QApplication app(argc, argv);

// Unindented for quoting purposes: QStringList numbers; numbers << "One" << "Two" << "Three" << "Four" << "Five"; QAbstractItemModel *model = new StringListModel(numbers);

QListView *view = new QListView; view->setWindowTitle("View onto a string list model"); view->setModel(model);

   model->insertRows(5, 7, QModelIndex());
   for (int row = 5; row < 12; ++row) {
       QModelIndex index = model->index(row, 0, QModelIndex());
       model->setData(index, QString::number(row+1));
   }
   view->show();
   return app.exec();

}


 </source>