diff options
Diffstat (limited to 'src/widgets/doc/src/model-view-programming.qdoc')
-rw-r--r-- | src/widgets/doc/src/model-view-programming.qdoc | 101 |
1 files changed, 39 insertions, 62 deletions
diff --git a/src/widgets/doc/src/model-view-programming.qdoc b/src/widgets/doc/src/model-view-programming.qdoc index f6b7c80656..5461619a4d 100644 --- a/src/widgets/doc/src/model-view-programming.qdoc +++ b/src/widgets/doc/src/model-view-programming.qdoc @@ -1,29 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:FDL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Free Documentation License Usage -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure -** the GNU Free Documentation License version 1.3 requirements -** will be met: https://www.gnu.org/licenses/fdl-1.3.html. -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only /*! \page model-view-programming.html \ingroup qt-basic-concepts @@ -465,14 +441,21 @@ Although this does not show a normal way of using a model, it demonstrates the conventions used by models when dealing with model indexes. + QFileSystemModel loading is asynchronous to minimize system resource use. + We have to take that into account when dealing with this model. + We construct a file system model in the following way: \snippet simplemodel-use/main.cpp 0 - In this case, we set up a default QFileSystemModel, obtain a parent index - using a specific implementation of \l{QFileSystemModel::}{index()} - provided by that model, and we count the number of rows in the model using - the \l{QFileSystemModel::}{rowCount()} function. + In this case, we start by setting up a default QFileSystemModel. We connect + its signal \c directoryLoaded(QString) to a lambda, in which we will + obtain a parent index for the directory using a specific + implementation of \l{QFileSystemModel::}{index()} provided by that model. + + In the lambda, we determine the number of rows in the model using the + \l{QFileSystemModel::}{rowCount()} function. + For simplicity, we are only interested in the items in the first column of the model. We examine each row in turn, obtaining a model index for @@ -493,6 +476,9 @@ \codeline \snippet simplemodel-use/main.cpp 3 + Finally, we set the root path of the QFileSystemModel so it starts + loading data and triggers the lambda. + The above example demonstrates the basic principles used to retrieve data from a model: @@ -693,30 +679,26 @@ \l QAbstractItemDelegate class. Delegates are expected to be able to render their contents themselves - by implementing the \l{QItemDelegate::paint()}{paint()} - and \l{QItemDelegate::sizeHint()}{sizeHint()} functions. - However, simple widget-based delegates can subclass \l QItemDelegate + by implementing the \l{QStyledItemDelegate::paint()}{paint()} + and \l{QStyledItemDelegate::sizeHint()}{sizeHint()} functions. + However, simple widget-based delegates can subclass \l QStyledItemDelegate instead of \l QAbstractItemDelegate, and take advantage of the default implementations of these functions. Editors for delegates can be implemented either by using widgets to manage - the editing process or by handling events directly. - The first approach is covered later in this section, and it is also - shown in the \l{Spin Box Delegate Example}{Spin Box Delegate} example. - - The \l{Pixelator Example}{Pixelator} example shows how to create a - custom delegate that performs specialized rendering for a table view. + the editing process or by handling events directly. The first approach is + covered later in this section. \section2 Using an existing delegate - The standard views provided with Qt use instances of \l QItemDelegate + The standard views provided with Qt use instances of \l QStyledItemDelegate to provide editing facilities. This default implementation of the delegate interface renders items in the usual style for each of the standard views: \l QListView, \l QTableView, and \l QTreeView. All the standard roles are handled by the default delegate used by the standard views. The way these are interpreted is described in the - QItemDelegate documentation. + QStyledItemDelegate documentation. The delegate used by a view is returned by the \l{QAbstractItemView::itemDelegate()}{itemDelegate()} function. @@ -735,13 +717,15 @@ data entry. We construct a table view to display the contents of the model, and this will use the custom delegate for editing. - \image spinboxdelegate-example.png + \image spinboxdelegate-example.webp We subclass the delegate from \l QStyledItemDelegate because we do not want to write custom display functions. However, we must still provide functions to manage the editor widget: - \snippet itemviews/spinboxdelegate/delegate.h 0 + \snippet qitemdelegate/spinbox-delegate.cpp declaration + \codeline + \snippet qitemdelegate/spinbox-delegate.cpp constructor Note that no editor widgets are set up when the delegate is constructed. We only construct an editor widget when it is needed. @@ -755,7 +739,7 @@ supplied with everything that the delegate needs to be able to set up a suitable widget: - \snippet itemviews/spinboxdelegate/delegate.cpp 1 + \snippet qitemdelegate/spinbox-delegate.cpp createEditor Note that we do not need to keep a pointer to the editor widget because the view takes responsibility for destroying it when it is no longer @@ -779,7 +763,7 @@ \l{Qt::ItemDataRole}{display role}, and set the value in the spin box accordingly. - \snippet itemviews/spinboxdelegate/delegate.cpp 2 + \snippet qitemdelegate/spinbox-delegate.cpp setEditorData In this example, we know that the editor widget is a spin box, but we could have provided different editors for different types of data in @@ -792,19 +776,19 @@ asks the delegate to store the edited value in the model by calling the \l{QAbstractItemDelegate::setModelData()}{setModelData()} function. - \snippet itemviews/spinboxdelegate/delegate.cpp 3 + \snippet qitemdelegate/spinbox-delegate.cpp setModelData Since the view manages the editor widgets for the delegate, we only need to update the model with the contents of the editor supplied. In this case, we ensure that the spin box is up-to-date, and update the model with the value it contains using the index specified. - The standard \l QItemDelegate class informs the view when it has + The standard \l QStyledItemDelegate class informs the view when it has finished editing by emitting the \l{QAbstractItemDelegate::closeEditor()}{closeEditor()} signal. The view ensures that the editor widget is closed and destroyed. In - this example, we only provide simple editing facilities, so we need - never emit this signal. + this example, we only provide simple editing facilities, so we never + need to emit this signal. All the operations on data are performed through the interface provided by \l QAbstractItemModel. This makes the delegate mostly @@ -823,7 +807,7 @@ the view provides all the necessary geometry information inside a \l{QStyleOptionViewItem}{view option} object. - \snippet itemviews/spinboxdelegate/delegate.cpp 4 + \snippet qitemdelegate/spinbox-delegate.cpp updateEditorGeometry In this case, we just use the geometry information provided by the view option in the item rectangle. A delegate that renders items with @@ -838,11 +822,11 @@ assist any subsequent editing operations. This is achieved by emitting the \l{QAbstractItemDelegate::closeEditor()}{closeEditor()} signal with a suitable hint. This is taken care of by the default - QItemDelegate event filter which we installed on the spin box when + QStyledItemDelegate event filter which we installed on the spin box when it was constructed. The behavior of the spin box could be adjusted to make it more user - friendly. In the default event filter supplied by QItemDelegate, if + friendly. In the default event filter supplied by QStyledItemDelegate, if the user hits \uicontrol Return to confirm their choice in the spin box, the delegate commits the value to the model and closes the spin box. We can change this behavior by installing our own event filter on the @@ -1003,8 +987,8 @@ \snippet reading-selections/window.cpp 0 - The above code uses Qt's convenient \l{Container Classes}{foreach - keyword} to iterate over, and modify, the items corresponding to the + The above code uses a range-based for-loop to iterate over, + and modify, the items corresponding to the indexes returned by the selection model. The selection model emits signals to indicate changes in the @@ -1611,7 +1595,6 @@ We can obtain a list of matching items with the \c findItems() function: - \snippet qtreewidget-using/mainwindow.cpp 6 \snippet qtreewidget-using/mainwindow.cpp 7 The above code causes items in a tree widget to be selected if they @@ -1833,8 +1816,6 @@ Note that the model will typically need to provide implementations of the QAbstractItemModel::insertRows() and QAbstractItemModel::setData() functions. - \sa {itemviews/puzzle}{Item Views Puzzle Example} - \section1 Proxy Models In the model/view framework, items of data supplied by a single model can be shared @@ -1913,7 +1894,7 @@ \section3 Custom sorting models - QSortFilterProxyModel instances use Qt's built-in qStableSort() function to set up + QSortFilterProxyModel instances use std::stable_sort() function to set up mappings between items in the source model and those in the proxy model, allowing a sorted hierarchy of items to be exposed to views without modifying the structure of the source model. To provide custom sorting behavior, reimplement the @@ -2328,10 +2309,6 @@ \section1 Related Examples \list - \li \l{itemviews/dirview}{Dir View} - \li \l{itemviews/spinboxdelegate}{Spin Box Delegate} - \li \l{itemviews/pixelator}{Pixelator} \li \l{itemviews/simpletreemodel}{Simple Tree Model} - \li \l{itemviews/chart}{Chart} \endlist */ |