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

The code introduced by 54d5ca0c27
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.

Pick-to: 6.4 6.3 6.2
Change-Id: I2a09878987df9edb9ff04f0ac4ad82af1a8b52c8
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
This commit is contained in:
Friedemann Kleint 2022-08-09 10:44:49 +02:00
parent b7812bbbb6
commit c49bf9fe27
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.
*/
#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
the model and some QLabel widgets, populate the window's layout with the
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[])
{
QApplication app(argc, argv);
QWidget *window = new QWidget;
QVBoxLayout *layout = new QVBoxLayout(window);
QLabel *title = new QLabel("Some items from the directory model", window);
QWidget window;
auto *layout = new QVBoxLayout(&window);
auto *title = new QLabel("Some items from the directory model", &window);
title->setBackgroundRole(QPalette::Base);
title->setMargin(8);
layout->addWidget(title);
//! [0]
QFileSystemModel *model = new QFileSystemModel;
connect(model, &QFileSystemModel::directoryLoaded, [model](const QString &directory) {
auto *model = new QFileSystemModel;
auto onDirectoryLoaded = [model, layout, &window](const QString &directory) {
QModelIndex parentIndex = model->index(directory);
int numRows = model->rowCount(parentIndex);
});
model->setRootPath(QDir::currentPath);
const int numRows = model->rowCount(parentIndex);
//! [1]
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]
//! [1]
for (int row = 0; row < numRows; ++row) {
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();
window.setWindowTitle("A simple model example");
window.show();
return app.exec();
}

View File

@ -449,11 +449,13 @@
\snippet simplemodel-use/main.cpp 0
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.
In the lambda, we count the number of rows in the model using the
\l{QFileSystemModel::}{rowCount()} function. Finally, we set the root path
of the QFileSystemModel so it starts loading data and triggers the lambda.
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
@ -474,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: