C++/Qt/QTreeView — различия между версиями
Admin (обсуждение | вклад) м (1 версия: Импорт контента...) |
(нет различий)
|
Текущая версия на 13:25, 25 мая 2010
Содержание
ObjectTreeModel and QTreeView
<source lang="cpp"> Foundations of Qt Development\Chapter05\treemodel\main.cpp /*
* Copyright (c) 2006-2007, Johan Thelin * * All rights reserved. * * 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 APress 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. * */
- include <QApplication>
- include <QTreeView>
- include "objecttreemodel.h"
int main( int argc, char **argv ) {
QApplication app( argc, argv ); QObject root; root.setObjectName( "root" ); QObject *child; QObject *foo = new QObject( &root ); foo->setObjectName( "foo" ); child = new QObject( foo ); child->setObjectName( "Mark" ); child = new QObject( foo ); child->setObjectName( "Bob" ); child = new QObject( foo ); child->setObjectName( "Kent" ); QObject *bar = new QObject( &root ); bar->setObjectName( "bar" ); child = new QObject( bar ); child->setObjectName( "Ole" ); child = new QObject( bar ); child->setObjectName( "Trond" ); child = new QObject( bar ); child->setObjectName( "Kjetil" ); child = new QObject( bar ); child->setObjectName( "Lasse" ); QObject *baz = new QObject( &root ); baz->setObjectName( "baz" ); child = new QObject( baz ); child->setObjectName( "Bengt" ); child = new QObject( baz ); child->setObjectName( "Sven" );
ObjectTreeModel model( &root ); QTreeView tree; tree.setModel( &model ); tree.show(); return app.exec();
}
Foundations of Qt Development\Chapter05\treemodel\objecttreemodel.cpp /*
* Copyright (c) 2006-2007, Johan Thelin * * All rights reserved. * * 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 APress 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. * */
- include <QMetaObject>
- include "objecttreemodel.h"
ObjectTreeModel::ObjectTreeModel( QObject *root, QObject *parent ) : QAbstractItemModel( parent ) {
m_root = root;
} Qt::ItemFlags ObjectTreeModel::flags(const QModelIndex &index) const {
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
} QVariant ObjectTreeModel::data( const QModelIndex &index, int role) const {
if( !index.isValid() ) return QVariant(); if( role == Qt::DisplayRole ) { switch( index.column() ) { case 0: return static_cast<QObject*>( index.internalPointer() )->objectName(); case 1: return static_cast<QObject*>( index.internalPointer() )->metaObject()->className(); default: break; } } else if( role == Qt::ToolTipRole ) { switch( index.column() ) { case 0: return QString( "The name of the object." ); case 1: return QString( "The name of the class." ); default: break; } } return QVariant();
} QVariant ObjectTreeModel::headerData(int section, Qt::Orientation orientation, int role ) const {
if( role != Qt::DisplayRole || orientation != Qt::Horizontal ) return QVariant(); switch( section ) { case 0: return QString( "Object" ); case 1: return QString( "Class" ); default: return QVariant(); }
} int ObjectTreeModel::rowCount(const QModelIndex &parent ) const {
QObject *parentObject; if( !parent.isValid() ) parentObject = m_root; else parentObject = static_cast<QObject*>( parent.internalPointer() ); return parentObject->children().count();
} int ObjectTreeModel::columnCount(const QModelIndex &parent ) const {
return 2;
} QModelIndex ObjectTreeModel::index(int row, int column, const QModelIndex &parent ) const {
QObject *parentObject; if( !parent.isValid() ) parentObject = m_root; else parentObject = static_cast<QObject*>( parent.internalPointer() ); if( row < parentObject->children().count() ) return createIndex( row, column, parentObject->children().at( row ) ); else return QModelIndex();
} QModelIndex ObjectTreeModel::parent(const QModelIndex &index) const {
if( !index.isValid() ) return QModelIndex(); QObject *indexObject = static_cast<QObject*>( index.internalPointer() ); QObject *parentObject = indexObject->parent(); if( parentObject == m_root ) return QModelIndex(); QObject *grandParentObject = parentObject->parent(); return createIndex( grandParentObject->children().indexOf( parentObject ), 0, parentObject );
}
Foundations of Qt Development\Chapter05\treemodel\objecttreemodel.h /*
* Copyright (c) 2006-2007, Johan Thelin * * All rights reserved. * * 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 APress 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. * */
- ifndef OBJECTTREEMODEL_H
- define OBJECTTREEMODEL_H
- include <QAbstractItemModel>
class ObjectTreeModel : public QAbstractItemModel { public:
ObjectTreeModel( QObject *root, QObject *parent = 0 ); Qt::ItemFlags flags( const QModelIndex &index ) const; QVariant data( const QModelIndex &index, int role ) const; QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; int rowCount( const QModelIndex &parent = QModelIndex() ) const; int columnCount( const QModelIndex &parent = QModelIndex() ) const; QModelIndex index( int row, int column, const QModelIndex &parent = QModelIndex() ) const; QModelIndex parent( const QModelIndex &index ) const;
private:
QObject *m_root;
};
- endif // OBJECTTREEMODEL_H
</source>
QTableView demo and QStandardItem
<source lang="cpp"> Foundations of Qt Development\Chapter05\readonlyview\main.cpp /*
* Copyright (c) 2006-2007, Johan Thelin * * All rights reserved. * * 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 APress 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. * */
- include <QApplication>
- include <QSplitter>
- include <QTreeView>
- include <QListView>
- include <QTableView>
- include <QStandardItemModel>
int main( int argc, char **argv ) {
QApplication app( argc, argv ); QTreeView *tree = new QTreeView(); QListView *list = new QListView(); QTableView *table = new QTableView(); QSplitter splitter; splitter.addWidget( tree ); splitter.addWidget( list ); splitter.addWidget( table ); QStandardItemModel model( 5, 2 ); for( int r=0; r<5; r++ ) for( int c=0; c<2; c++) { QStandardItem *item = new QStandardItem( QString("Row:%0, Column:%1").arg(r).arg(c) ); if( c == 0 ) for( int i=0; i<3; i++ ) { QStandardItem *child = new QStandardItem( QString("Item %0").arg(i) ); child->setEditable( false ); item->appendRow( child ); } model.setItem(r, c, item); } model.setHorizontalHeaderItem( 0, new QStandardItem( "Foo" ) ); model.setHorizontalHeaderItem( 1, new QStandardItem( "Bar-Baz" ) ); tree->setModel( &model ); list->setModel( &model ); table->setModel( &model ); list->setSelectionModel( tree->selectionModel() ); table->setSelectionModel( tree->selectionModel() ); table->setSelectionBehavior( QAbstractItemView::SelectRows ); table->setSelectionMode( QAbstractItemView::SingleSelection ); splitter.show(); return app.exec();
}
</source>
QTreeView demo and QStandardItem
<source lang="cpp"> Foundations of Qt Development\Chapter05\readonlyview\main.cpp /*
* Copyright (c) 2006-2007, Johan Thelin * * All rights reserved. * * 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 APress 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. * */
- include <QApplication>
- include <QSplitter>
- include <QTreeView>
- include <QListView>
- include <QTableView>
- include <QStandardItemModel>
int main( int argc, char **argv ) {
QApplication app( argc, argv ); QTreeView *tree = new QTreeView(); QListView *list = new QListView(); QTableView *table = new QTableView(); QSplitter splitter; splitter.addWidget( tree ); splitter.addWidget( list ); splitter.addWidget( table ); QStandardItemModel model( 5, 2 ); for( int r=0; r<5; r++ ) for( int c=0; c<2; c++) { QStandardItem *item = new QStandardItem( QString("Row:%0, Column:%1").arg(r).arg(c) ); if( c == 0 ) for( int i=0; i<3; i++ ) { QStandardItem *child = new QStandardItem( QString("Item %0").arg(i) ); child->setEditable( false ); item->appendRow( child ); } model.setItem(r, c, item); } model.setHorizontalHeaderItem( 0, new QStandardItem( "Foo" ) ); model.setHorizontalHeaderItem( 1, new QStandardItem( "Bar-Baz" ) ); tree->setModel( &model ); list->setModel( &model ); table->setModel( &model ); list->setSelectionModel( tree->selectionModel() ); table->setSelectionModel( tree->selectionModel() ); table->setSelectionBehavior( QAbstractItemView::SelectRows ); table->setSelectionMode( QAbstractItemView::SingleSelection ); splitter.show(); return app.exec();
}
</source>
QTreeView drag and drop
<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$
-
- /
/****************************************************************************
- 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 an example program for Qt.
- EDITIONS: NOLIMITS
-
- /
- ifndef DRAGDROPMODEL_H
- define DRAGDROPMODEL_H
- include "treemodel.h"
class DragDropModel : public TreeModel {
Q_OBJECT
public:
DragDropModel(const QStringList &strings, QObject *parent = 0); Qt::ItemFlags flags(const QModelIndex &index) const; bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent); QMimeData *mimeData(const QModelIndexList &indexes) const; QStringList mimeTypes() const; Qt::DropActions supportedDropActions() const;
};
- endif
- include <QtGui>
- include "dragdropmodel.h"
DragDropModel::DragDropModel(const QStringList &strings, QObject *parent)
: TreeModel(strings, parent)
{ } bool DragDropModel::dropMimeData(const QMimeData *data,
Qt::DropAction action, int row, int column, const QModelIndex &parent)
{
if (action == Qt::IgnoreAction) return true; if (!data->hasFormat("text/plain")) return false; int beginRow; if (row != -1) beginRow = row; else if (parent.isValid()) beginRow = 0; else beginRow = rowCount(QModelIndex()); QByteArray encodedData = data->data("text/plain"); QDataStream stream(&encodedData, QIODevice::ReadOnly); QHash<qint64, QMap<int,QHash<int,QString> > > newItems; while (!stream.atEnd()) { qint64 id; int row; int column; QString text; stream >> id >> row >> column >> text; newItems[id][row][column] = text; } int rows = newItems.count(); insertRows(beginRow, rows, parent); QMap<int,QHash<int,QString> > childItems; foreach (childItems, newItems.values()) { QHash<int,QString> rowItems; foreach (rowItems, childItems.values()) { foreach (int column, rowItems.keys()) { QModelIndex idx = index(beginRow, column, parent); setData(idx, rowItems[column]); } ++beginRow; } } return true;
} Qt::ItemFlags DragDropModel::flags(const QModelIndex &index) const {
Qt::ItemFlags defaultFlags = TreeModel::flags(index); if (index.isValid()) return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | defaultFlags; else return Qt::ItemIsDropEnabled | defaultFlags;
} QMimeData *DragDropModel::mimeData(const QModelIndexList &indexes) const {
QMimeData *mimeData = new QMimeData(); QByteArray encodedData; QDataStream stream(&encodedData, QIODevice::WriteOnly); foreach (QModelIndex index, indexes) { if (index.isValid()) { QString text = data(index, Qt::DisplayRole).toString(); stream << index.internalId() << index.row() << index.column() << text; } } mimeData->setData("text/plain", encodedData); return mimeData;
} QStringList DragDropModel::mimeTypes() const {
QStringList types; types << "text/plain"; return types;
} Qt::DropActions DragDropModel::supportedDropActions() const {
return Qt::CopyAction | Qt::MoveAction;
}
- ifndef TREEITEM_H
- define TREEITEM_H
- include <QList>
- include <QVariant>
class TreeItem { public:
TreeItem(const QList<QVariant> &data, TreeItem *parent = 0); ~TreeItem(); void appendChild(TreeItem *child); TreeItem *child(int row); int childCount() const; int columnCount() const; QVariant data(int column) const; bool insertChild(int row, TreeItem *item); TreeItem *parent(); bool removeChild(int row); int row() const; bool setData(int column, const QVariant &data);
private:
QList<TreeItem*> childItems; QList<QVariant> itemData; TreeItem *parentItem;
};
- endif
/*
treeitem.cpp A container for items of data supplied by the simple tree model.
- /
- include <QStringList>
- include "treeitem.h"
TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent) {
parentItem = parent; itemData = data;
} TreeItem::~TreeItem() {
qDeleteAll(childItems);
} void TreeItem::appendChild(TreeItem *item) {
childItems.append(item);
} TreeItem *TreeItem::child(int row) {
return childItems.value(row);
} int TreeItem::childCount() const {
return childItems.count();
} int TreeItem::columnCount() const {
return itemData.count();
} QVariant TreeItem::data(int column) const {
return itemData.value(column);
} bool TreeItem::insertChild(int row, TreeItem *item) {
if (row < 0 || row > childItems.count()) return false; childItems.insert(row, item); return true;
} TreeItem *TreeItem::parent() {
return parentItem;
} bool TreeItem::removeChild(int row) {
if (row < 0 || row >= childItems.count()) return false; delete childItems.takeAt(row); return true;
} int TreeItem::row() const {
if (parentItem) return parentItem->childItems.indexOf(const_cast<TreeItem*>(this)); return 0;
} bool TreeItem::setData(int column, const QVariant &data) {
if (column < 0 || column >= itemData.count()) return false; itemData.replace(column, data); return true;
}
- ifndef TREEMODEL_H
- define TREEMODEL_H
- include <QAbstractItemModel>
- include <QModelIndex>
- include <QVariant>
class TreeItem; class TreeModel : public QAbstractItemModel {
Q_OBJECT
public:
TreeModel(const QStringList &strings, QObject *parent = 0); ~TreeModel(); QVariant data(const QModelIndex &index, int role) const; Qt::ItemFlags flags(const QModelIndex &index) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; QModelIndex parent(const QModelIndex &index) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; bool insertRows(int position, int rows, const QModelIndex &parent = QModelIndex()); bool removeRows(int position, int rows, const QModelIndex &parent = QModelIndex()); bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
private:
void setupModelData(const QStringList &lines, TreeItem *parent); TreeItem *rootItem;
};
- endif
/*
treemodel.cpp Provides a simple tree model to show how to create and use hierarchical models.
- /
- include <QtGui>
- include "treeitem.h"
- include "treemodel.h"
TreeModel::TreeModel(const QStringList &strings, QObject *parent)
: QAbstractItemModel(parent)
{
QList<QVariant> rootData; rootData << "Title" << "Summary"; rootItem = new TreeItem(rootData); setupModelData(strings, rootItem);
} TreeModel::~TreeModel() {
delete rootItem;
} int TreeModel::columnCount(const QModelIndex &parent) const {
if (parent.isValid()) return static_cast<TreeItem*>(parent.internalPointer())->columnCount(); else return rootItem->columnCount();
} QVariant TreeModel::data(const QModelIndex &index, int role) const {
if (!index.isValid()) return QVariant(); if (role != Qt::DisplayRole) return QVariant(); TreeItem *item = static_cast<TreeItem*>(index.internalPointer()); return item->data(index.column());
} Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const {
if (!index.isValid()) return Qt::ItemIsEnabled; return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
} QVariant TreeModel::headerData(int section, Qt::Orientation orientation,
int role) const
{
if (orientation == Qt::Horizontal && role == Qt::DisplayRole) return rootItem->data(section); return QVariant();
} QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent)
const
{
TreeItem *parentItem; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast<TreeItem*>(parent.internalPointer()); TreeItem *childItem = parentItem->child(row); if (childItem) return createIndex(row, column, childItem); else return QModelIndex();
} bool TreeModel::insertRows(int position, int rows, const QModelIndex &parent) {
TreeItem *parentItem; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast<TreeItem*>(parent.internalPointer()); if (position < 0 || position > parentItem->childCount()) return false; QList<QVariant> blankList; for (int column = 0; column < columnCount(); ++column) blankList << QVariant(""); beginInsertRows(parent, position, position + rows - 1); for (int row = 0; row < rows; ++row) { TreeItem *newItem = new TreeItem(blankList, parentItem); if (!parentItem->insertChild(position, newItem)) break; } endInsertRows(); return true;
} QModelIndex TreeModel::parent(const QModelIndex &index) const {
if (!index.isValid()) return QModelIndex(); TreeItem *childItem = static_cast<TreeItem*>(index.internalPointer()); TreeItem *parentItem = childItem->parent(); if (parentItem == rootItem) return QModelIndex(); return createIndex(parentItem->row(), 0, parentItem);
} bool TreeModel::removeRows(int position, int rows, const QModelIndex &parent) {
TreeItem *parentItem; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast<TreeItem*>(parent.internalPointer()); if (position < 0 || position > parentItem->childCount()) return false; beginRemoveRows(parent, position, position + rows - 1); for (int row = 0; row < rows; ++row) { if (!parentItem->removeChild(position)) break; } endRemoveRows(); return true;
} int TreeModel::rowCount(const QModelIndex &parent) const {
TreeItem *parentItem; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast<TreeItem*>(parent.internalPointer()); return parentItem->childCount();
} bool TreeModel::setData(const QModelIndex &index,
const QVariant &value, int role)
{
if (!index.isValid() || role != Qt::EditRole) return false; TreeItem *item = static_cast<TreeItem*>(index.internalPointer()); if (item->setData(index.column(), value)) emit dataChanged(index, index); else return false; return true;
} void TreeModel::setupModelData(const QStringList &lines, TreeItem *parent) {
QList<TreeItem*> parents; QList<int> indentations; parents << parent; indentations << 0; int number = 0; while (number < lines.count()) { int position = 0; while (position < lines[number].length()) { if (lines[number].mid(position, 1) != " ") break; position++; } QString lineData = lines[number].mid(position).trimmed(); if (!lineData.isEmpty()) { // Read the column data from the rest of the line. QStringList columnStrings = lineData.split("\t", QString::SkipEmptyParts); QList<QVariant> columnData; for (int column = 0; column < columnStrings.count(); ++column) columnData << columnStrings[column]; if (position > indentations.last()) { // The last child of the current parent is now the new parent // unless the current parent has no children. if (parents.last()->childCount() > 0) { parents << parents.last()->child(parents.last()->childCount()-1); indentations << position; } } else { while (position < indentations.last() && parents.count() > 0) { parents.pop_back(); indentations.pop_back(); } } // Append a new item to the current parent"s list of children. parents.last()->appendChild(new TreeItem(columnData, parents.last())); } number++; }
}
- ifndef WINDOW_H
- define WINDOW_H
- include <QMainWindow>
class QTreeView; class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow();
private:
void setupItems(); QTreeView *treeView;
};
- endif
- include <QtGui>
- include "mainwindow.h"
- include "dragdropmodel.h"
MainWindow::MainWindow() {
QMenu *fileMenu = new QMenu(tr("&File")); QAction *quitAction = fileMenu->addAction(tr("E&xit")); quitAction->setShortcut(tr("Ctrl+Q")); menuBar()->addMenu(fileMenu);
// For convenient quoting:
QTreeView *treeView = new QTreeView(this); treeView->setSelectionMode(QAbstractItemView::ExtendedSelection); treeView->setDragEnabled(true); treeView->setAcceptDrops(true); treeView->setDropIndicatorShown(true); this->treeView = treeView; connect(quitAction, SIGNAL(triggered()), this, SLOT(close())); setupItems(); setCentralWidget(treeView); setWindowTitle(tr("Tree View"));
} void MainWindow::setupItems() {
QStringList items; items << tr("Widgets\tUser interface objects used to create GUI applications.") << tr(" QWidget\tThe basic building block for all other widgets.") << tr(" QDialog\tThe base class for dialog windows.") << tr("Tools\tUtilities and applications for Qt developers.") << tr(" Qt Designer\tA GUI form designer for Qt applications.") << tr(" Qt Assistant\tA documentation browser for Qt documentation."); DragDropModel *model = new DragDropModel(items, this); QModelIndex index = model->index(0, 0, QModelIndex()); model->insertRows(2, 3, index); index = model->index(0, 0, QModelIndex()); index = model->index(2, 0, index); model->setData(index, QVariant("QFrame")); model->removeRows(3, 2, index.parent()); treeView->setModel(model);
}
- include <QtGui>
- include "mainwindow.h"
int main(int argc, char *argv[]) {
QApplication app(argc, argv); MainWindow *window = new MainWindow; window->show(); return app.exec();
}
</source>
Some selections made using a table view
<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 WINDOW_H
- define WINDOW_H
- include <QItemSelection>
- include <QMainWindow>
- include <QModelIndex>
- include <QWidget>
- include <QTableView>
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
public slots:
void updateSelection(const QItemSelection &selected, const QItemSelection &deselected); void changeCurrent(const QModelIndex ¤t, const QModelIndex &previous);
private:
QAbstractItemModel *model; QItemSelectionModel *selectionModel; QTableView *table;
};
- endif
/*
window.cpp A minimal subclass of QTableView with slots to allow the selection model to be monitored.
- /
- include <QAbstractItemModel>
- include <QItemSelection>
- include <QItemSelectionModel>
- include <QStatusBar>
- include "model.h"
- 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); selectionModel = table->selectionModel(); connect(selectionModel, SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), this, SLOT(updateSelection(const QItemSelection &, const QItemSelection &))); connect(selectionModel, SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(changeCurrent(const QModelIndex &, const QModelIndex &))); statusBar(); setCentralWidget(table);
}
void MainWindow::updateSelection(const QItemSelection &selected,
const QItemSelection &deselected)
{
QModelIndex index; QModelIndexList items = selected.indexes(); foreach (index, items) { QString text = QString("(%1,%2)").arg(index.row()).arg(index.column()); model->setData(index, text); }
items = deselected.indexes(); foreach (index, items) model->setData(index, "");
}
void MainWindow::changeCurrent(const QModelIndex ¤t,
const QModelIndex &previous)
{
statusBar()->showMessage( tr("Moved from (%1,%2) to (%3,%4)") .arg(previous.row()).arg(previous.column()) .arg(current.row()).arg(current.column()));
}
/****************************************************************************
- 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 <QAbstractTableModel>
- include <QStringList>
- 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;
};
- endif
/*
model.cpp Provides a table model for use in various examples.
- /
- include <QtGui>
- 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;
}
/****************************************************************************
- 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$
-
- /
/*
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.
- /
- include <QApplication>
- 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>
Using QTreeView
<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 WINDOW_H
- define WINDOW_H
- include <QMainWindow>
class QAction; class QTreeWidget; class QTreeWidgetItem; class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow();
public slots:
void findItems(); void insertItem(); void removeItem(); void sortAscending(); void sortDescending(); void updateMenus(QTreeWidgetItem *current); void updateSortItems();
private:
void setupTreeItems(); QAction *ascendingAction; QAction *autoSortAction; QAction *descendingAction; QAction *insertAction; QAction *removeAction; QTreeWidget *treeWidget;
};
- endif
- include <QtGui>
- include "mainwindow.h"
MainWindow::MainWindow() {
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")); removeAction->setEnabled(false); itemsMenu->addSeparator(); ascendingAction = itemsMenu->addAction(tr("Sort in &Ascending Order")); descendingAction = itemsMenu->addAction(tr("Sort in &Descending Order")); autoSortAction = itemsMenu->addAction(tr("&Automatically Sort Items")); autoSortAction->setCheckable(true); itemsMenu->addSeparator(); QAction *findItemsAction = itemsMenu->addAction(tr("&Find Items")); findItemsAction->setShortcut(tr("Ctrl+F")); menuBar()->addMenu(fileMenu); menuBar()->addMenu(itemsMenu);
/* For convenient quoting:
QTreeWidget *treeWidget = new QTreeWidget(this);
- /
treeWidget = new QTreeWidget(this); treeWidget->setColumnCount(2); QStringList headers; headers << tr("Subject") << tr("Default"); treeWidget->setHeaderLabels(headers);
connect(quitAction, SIGNAL(triggered()), this, SLOT(close())); connect(ascendingAction, SIGNAL(triggered()), this, SLOT(sortAscending())); connect(autoSortAction, SIGNAL(triggered()), this, SLOT(updateSortItems())); connect(descendingAction, SIGNAL(triggered()), this, SLOT(sortDescending())); connect(findItemsAction, SIGNAL(triggered()), this, SLOT(findItems())); connect(insertAction, SIGNAL(triggered()), this, SLOT(insertItem())); connect(removeAction, SIGNAL(triggered()), this, SLOT(removeItem())); connect(treeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(updateMenus(QTreeWidgetItem *))); setupTreeItems(); updateMenus(treeWidget->currentItem()); setCentralWidget(treeWidget); setWindowTitle(tr("Tree Widget"));
} void MainWindow::setupTreeItems() {
QTreeWidgetItem *cities = new QTreeWidgetItem(treeWidget); cities->setText(0, tr("Cities")); QTreeWidgetItem *osloItem = new QTreeWidgetItem(cities); osloItem->setText(0, tr("Oslo")); osloItem->setText(1, tr("Yes"));
(new QTreeWidgetItem(cities))->setText(0, tr("Stockholm")); (new QTreeWidgetItem(cities))->setText(0, tr("Helsinki")); (new QTreeWidgetItem(cities))->setText(0, tr("Copenhagen")); QTreeWidgetItem *planets = new QTreeWidgetItem(treeWidget, cities); planets->setText(0, tr("Planets")); (new QTreeWidgetItem(planets))->setText(0, tr("Mercury")); (new QTreeWidgetItem(planets))->setText(0, tr("Venus")); QTreeWidgetItem *earthItem = new QTreeWidgetItem(planets); earthItem->setText(0, tr("Earth")); earthItem->setText(1, tr("Yes")); (new QTreeWidgetItem(planets))->setText(0, tr("Mars")); (new QTreeWidgetItem(planets))->setText(0, tr("Jupiter")); (new QTreeWidgetItem(planets))->setText(0, tr("Saturn")); (new QTreeWidgetItem(planets))->setText(0, tr("Uranus")); (new QTreeWidgetItem(planets))->setText(0, tr("Neptune")); (new QTreeWidgetItem(planets))->setText(0, tr("Pluto"));
} void MainWindow::findItems() {
QString itemText = QInputDialog::getText(this, tr("Find Items"), tr("Text to find (including wildcards):")); if (itemText.isEmpty()) return;
QTreeWidgetItem *item; foreach (item, treeWidget->selectedItems()) treeWidget->setItemSelected(item, false);
QList<QTreeWidgetItem *> found = treeWidget->findItems( itemText, Qt::MatchWildcard); foreach (item, found) { treeWidget->setItemSelected(item, true); // Show the item->text(0) for each item. }
} void MainWindow::insertItem() {
QTreeWidgetItem *currentItem = treeWidget->currentItem(); if (!currentItem) return; QString itemText = QInputDialog::getText(this, tr("Insert Item"), tr("Input text for the new item:")); if (itemText.isEmpty()) return;
QTreeWidgetItem *parent = currentItem->parent(); QTreeWidgetItem *newItem; if (parent) newItem = new QTreeWidgetItem(parent, treeWidget->currentItem()); else newItem = new QTreeWidgetItem(treeWidget, treeWidget->currentItem());
newItem->setText(0, itemText);
} void MainWindow::removeItem() {
QTreeWidgetItem *currentItem = treeWidget->currentItem(); if (!currentItem) return;
QTreeWidgetItem *parent = currentItem->parent(); int index; if (parent) { index = parent->indexOfChild(treeWidget->currentItem()); delete parent->takeChild(index); } else { index = treeWidget->indexOfTopLevelItem(treeWidget->currentItem()); delete treeWidget->takeTopLevelItem(index); }
} void MainWindow::sortAscending() {
treeWidget->sortItems(0, Qt::AscendingOrder);
} void MainWindow::sortDescending() {
treeWidget->sortItems(0, Qt::DescendingOrder);
} void MainWindow::updateMenus(QTreeWidgetItem *current) {
insertAction->setEnabled(current != 0); removeAction->setEnabled(current != 0);
} void MainWindow::updateSortItems() {
ascendingAction->setEnabled(!autoSortAction->isChecked()); descendingAction->setEnabled(!autoSortAction->isChecked()); treeWidget->setSortingEnabled(autoSortAction->isChecked());
}
- include <QtGui>
- include "mainwindow.h"
int main(int argc, char *argv[]) {
QApplication app(argc, argv); MainWindow *window = new MainWindow; window->show(); return app.exec();
}
</source>
<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$
-
- /
/*
main.cpp A simple example of how to view a model in several views, and share a selection model.
- /
- include <QtGui>
int main(int argc, char *argv[]) {
QApplication app(argc, argv); QSplitter *splitter = new QSplitter; QDirModel *model = new QDirModel; QTreeView *tree = new QTreeView(splitter); tree->setModel(model); tree->setRootIndex(model->index(QDir::currentPath()));
QListView *list = new QListView(splitter); list->setModel(model); list->setRootIndex(model->index(QDir::currentPath()));
QItemSelectionModel *selection = new QItemSelectionModel(model); tree->setSelectionModel(selection); list->setSelectionModel(selection);
splitter->setWindowTitle("Two views onto the same directory model"); splitter->show(); return app.exec();
}
</source>