mirror of https://github.com/qt/qtbase.git
94 lines
3.4 KiB
Plaintext
94 lines
3.4 KiB
Plaintext
// Copyright (C) 2016 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
|
|
|
|
/*!
|
|
\example itemviews/fetchmore
|
|
\title Fetch More Example
|
|
\examplecategory {User Interface Components}
|
|
\ingroup examples-itemviews
|
|
\brief The Fetch More example shows how to add items to an item view
|
|
model on demand.
|
|
|
|
\image fetchmore-example.png
|
|
|
|
When you have large - or perhaps even infinite - data sets, you
|
|
will need to add items to the model in batches, and preferably only
|
|
when the items are needed by the view (i.e., when they become visible
|
|
in the view).
|
|
|
|
In this example, we implement \c FileListModel - an item view
|
|
model containing the entries of a directory. We also have \c
|
|
Window, which sets up the GUI and feeds the model with
|
|
directories.
|
|
|
|
The UI consists of a dialog with a list showing the contents
|
|
of the root directory. Directories can be navigated by double-clicking.
|
|
|
|
At the bottom, there is a log window displaying messages when the view
|
|
asks the model for more data.
|
|
|
|
To exercise it, navigate to a large directory (say \c /bin), and scroll
|
|
to the bottom. Log messages appear showing the data being retrieved.
|
|
|
|
Let's take a tour of \c {FileListModel}'s code.
|
|
|
|
\section1 FileListModel Class Definition
|
|
|
|
The \c FileListModel inherits QAbstractListModel and contains the
|
|
contents of a directory. It will add items to itself only when
|
|
requested to do so by the view.
|
|
|
|
\snippet itemviews/fetchmore/filelistmodel.h 0
|
|
|
|
The secret lies in the reimplementation of
|
|
\l{QAbstractItemModel::}{fetchMore()} and
|
|
\l{QAbstractItemModel::}{canFetchMore()} from QAbstractItemModel.
|
|
These functions are called by the item view when it needs more
|
|
items.
|
|
|
|
The \c setDirPath() function sets the directory the model will
|
|
work on. We emit \c numberPopulated() each time we add a batch of
|
|
items to the model.
|
|
|
|
We keep all directory entries in \c fileList. \c fileCount is the
|
|
number of items that have been added to the model.
|
|
|
|
\section1 FileListModel Class Implementation
|
|
|
|
We start by checking out the \c setDirPath().
|
|
|
|
\snippet itemviews/fetchmore/filelistmodel.cpp 0
|
|
|
|
We use a QDir to get the contents of the directory. We need to
|
|
inform QAbstractItemModel that we want to remove all items - if
|
|
any - from the model.
|
|
|
|
\snippet itemviews/fetchmore/filelistmodel.cpp 1
|
|
|
|
The \c canFetchMore() function is called by the view when it needs
|
|
more items. We return true if there still are entries that we have
|
|
not added to the model; otherwise, we return false.
|
|
|
|
And now, the \c fetchMore() function itself:
|
|
|
|
\snippet itemviews/fetchmore/filelistmodel.cpp 2
|
|
|
|
We first calculate the number of items to fetch.
|
|
\l{QAbstractItemModel::}{beginInsertRows()} and
|
|
\l{QAbstractItemModel::}{endInsertRows()} are mandatory for
|
|
QAbstractItemModel to keep up with the row insertions. Finally, we
|
|
emit \c numberPopulated(), which is picked up by \c Window.
|
|
|
|
To complete the tour, we also look at \c rowCount() and \c data().
|
|
|
|
\snippet itemviews/fetchmore/filelistmodel.cpp 4
|
|
|
|
Notice that the row count is only the items we have added so far,
|
|
i.e., not the number of entries in the directory.
|
|
|
|
In \c data(), we return the appropriate entry from the \c
|
|
fileList. We also separate the batches with a different background
|
|
color.
|
|
*/
|
|
|