Documentation: Fix "Using Model Indexes" in Model View Programming guide to work

The code introduced by 54d5ca0c2766e915c960fa437cee6c20a324c1a7
did not work since the variables parentIndex/numRows
were local to the lambda and the outer code would not wait.
Move the widgets population into the lambda to fix this.

Modernize the remaining code a bit.

Change-Id: I2a09878987df9edb9ff04f0ac4ad82af1a8b52c8
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
(cherry picked from commit c49bf9fe27e0632aa8da393ff007cf4577a1c9cd)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Friedemann Kleint 2022-08-09 10:44:49 +02:00 committed by Qt Cherry-pick Bot
parent 6927221238
commit 5577d934c5
2 changed files with 46 additions and 35 deletions

View File

@ -7,55 +7,61 @@
A simple example of how to access items from an existing model. A simple example of how to access items from an existing model.
*/ */
#include <QtGui> #include <QApplication>
#include <QLabel>
#include <QVBoxLayout>
#include <QWidget>
#include <QFileSystemModel>
#include <QPalette>
#include <QDir>
#include <QModelIndex>
/*! /*!
Create a default directory model and, using the index-based interface to Create a default directory model and, using the index-based interface to
the model and some QLabel widgets, populate the window's layout with the the model and some QLabel widgets, populate the window's layout with the
names of objects in the directory. names of objects in the directory.
Note that we only want to read the filenames in the highest level of the
directory, so we supply a default (invalid) QModelIndex to the model in
order to indicate that we want top-level items.
*/ */
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
QApplication app(argc, argv); QApplication app(argc, argv);
QWidget *window = new QWidget; QWidget window;
QVBoxLayout *layout = new QVBoxLayout(window); auto *layout = new QVBoxLayout(&window);
QLabel *title = new QLabel("Some items from the directory model", window); auto *title = new QLabel("Some items from the directory model", &window);
title->setBackgroundRole(QPalette::Base); title->setBackgroundRole(QPalette::Base);
title->setMargin(8); title->setMargin(8);
layout->addWidget(title); layout->addWidget(title);
//! [0] //! [0]
QFileSystemModel *model = new QFileSystemModel; auto *model = new QFileSystemModel;
connect(model, &QFileSystemModel::directoryLoaded, [model](const QString &directory) {
auto onDirectoryLoaded = [model, layout, &window](const QString &directory) {
QModelIndex parentIndex = model->index(directory); QModelIndex parentIndex = model->index(directory);
int numRows = model->rowCount(parentIndex); const int numRows = model->rowCount(parentIndex);
}); //! [1]
model->setRootPath(QDir::currentPath); for (int row = 0; row < numRows; ++row) {
QModelIndex index = model->index(row, 0, parentIndex);
//! [1]
//! [2]
QString text = model->data(index, Qt::DisplayRole).toString();
//! [2]
// Display the text in a widget.
auto *label = new QLabel(text, &window);
layout->addWidget(label);
//! [3]
}
//! [3]
};
QObject::connect(model, &QFileSystemModel::directoryLoaded, onDirectoryLoaded);
model->setRootPath(QDir::currentPath());
//! [0] //! [0]
//! [1] window.setWindowTitle("A simple model example");
for (int row = 0; row < numRows; ++row) { window.show();
QModelIndex index = model->index(row, 0, parentIndex);
//! [1]
//! [2]
QString text = model->data(index, Qt::DisplayRole).toString();
// Display the text in a widget.
//! [2]
QLabel *label = new QLabel(text, window);
layout->addWidget(label);
//! [3]
}
//! [3]
window->setWindowTitle("A simple model example");
window->show();
return app.exec(); return app.exec();
} }

View File

@ -449,11 +449,13 @@
\snippet simplemodel-use/main.cpp 0 \snippet simplemodel-use/main.cpp 0
In this case, we start by setting up a default QFileSystemModel. We connect In this case, we start by setting up a default QFileSystemModel. We connect
it to a lambda, in which we will obtain a parent index using a specific 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. implementation of \l{QFileSystemModel::}{index()} provided by that model.
In the lambda, we count the number of rows in the model using the
\l{QFileSystemModel::}{rowCount()} function. Finally, we set the root path In the lambda, we determine the number of rows in the model using the
of the QFileSystemModel so it starts loading data and triggers the lambda. \l{QFileSystemModel::}{rowCount()} function.
For simplicity, we are only interested in the items in the first column 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 of the model. We examine each row in turn, obtaining a model index for
@ -474,6 +476,9 @@
\codeline \codeline
\snippet simplemodel-use/main.cpp 3 \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 The above example demonstrates the basic principles used to retrieve
data from a model: data from a model: