C++/Qt/QAbstractListModel
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$
-
- /
- ifndef FILELISTMODEL_H
- define FILELISTMODEL_H
- include <QAbstractListModel>
- include <QList>
- 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;
};
- 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$
-
- /
- include "filelistmodel.h"
- include <QApplication>
- include <QPalette>
- include <QBrush>
- 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();
}
- ifndef WINDOW_H
- define WINDOW_H
- 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;
};
- endif
- include <QtGui>
- include "filelistmodel.h"
- 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));
}
- include <QApplication>
- 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$
-
- /
- ifndef MODEL_H
- define MODEL_H
- include <QAbstractListModel>
- include <QObject>
- 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;
};
- endif
/*
model.cpp A simple model that uses a QStringList as its data source.
- /
- include <qdebug.h>
- 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;
}
- ifndef MAINWINDOW_H
- define MAINWINDOW_H
- include <QMainWindow>
- 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 ¤tIndex);
private:
QAbstractItemModel *model; QAction *insertAction; QAction *removeAction; QItemSelectionModel *selectionModel;
};
- endif
- include <QtGui>
- include "mainwindow.h"
- 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 ¤tIndex) {
insertAction->setEnabled(currentIndex.isValid()); removeAction->setEnabled(currentIndex.isValid());
}
- include <QApplication>
- 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$
-
- /
- ifndef MODEL_H
- define MODEL_H
- include <QAbstractListModel>
- include <QObject>
- 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;
};
- endif
/*
model.cpp A simple model that uses a QStringList as its data source.
- /
- 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.
- /
- include <QAbstractItemModel>
- include <QApplication>
- include <QListView>
- 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>