From 6e73df64e2e9aaadb95d3b160f07b80b377490ed Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 22 Apr 2021 11:29:08 +0200 Subject: [PATCH] Rewrite the fetchmore example - Start in root folder so that large directories (/bin/, Windows) are easily reachable - Remove the line edit and navigate by double clicking instead since this is more in line with expectations - Use a QPlainTextEdit for logging - Make the log message more informative - Add icons Change-Id: Ia3cd7fc143efef80772923291f0b711913aa47be Reviewed-by: Paul Wicking (cherry picked from commit 2393a40ccd455cc2dca410e8a1830856dbfde12d) --- doc/src/images/fetchmore-example.png | Bin 19169 -> 19872 bytes examples/widgets/doc/src/fetchmore.qdoc | 17 +++--- .../itemviews/fetchmore/filelistmodel.cpp | 49 +++++++++++------- .../itemviews/fetchmore/filelistmodel.h | 13 +++-- .../widgets/itemviews/fetchmore/window.cpp | 48 +++++++++-------- examples/widgets/itemviews/fetchmore/window.h | 13 +++-- 6 files changed, 87 insertions(+), 53 deletions(-) diff --git a/doc/src/images/fetchmore-example.png b/doc/src/images/fetchmore-example.png index e8c689ad5e6e7f407c7a755b022da7ce95cca5f6..7af30119c48e157a8e24be6e30b7b8d99eb29dc3 100644 GIT binary patch literal 19872 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 V>Pbbu;E*Z-bGVi1ZQ~R8zX2_)FmwO_ diff --git a/examples/widgets/doc/src/fetchmore.qdoc b/examples/widgets/doc/src/fetchmore.qdoc index a27efaf0716..940a2523197 100644 --- a/examples/widgets/doc/src/fetchmore.qdoc +++ b/examples/widgets/doc/src/fetchmore.qdoc @@ -34,15 +34,9 @@ \image fetchmore-example.png - - This example consists of a dialog where you can enter a directory - name in the \uicontrol Directory edit field. The application loads and - visualizes all files it finds as you are typing. It is not required - to press [Enter] to launch the search. - 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 are visible + 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 @@ -50,6 +44,15 @@ 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 diff --git a/examples/widgets/itemviews/fetchmore/filelistmodel.cpp b/examples/widgets/itemviews/fetchmore/filelistmodel.cpp index 3ee80617c0f..5c93aba6f49 100644 --- a/examples/widgets/itemviews/fetchmore/filelistmodel.cpp +++ b/examples/widgets/itemviews/fetchmore/filelistmodel.cpp @@ -54,8 +54,10 @@ #include #include +static const int batchSize = 100; + FileListModel::FileListModel(QObject *parent) - : QAbstractListModel(parent), fileCount(0) + : QAbstractListModel(parent) {} //![4] @@ -67,24 +69,33 @@ int FileListModel::rowCount(const QModelIndex &parent) const QVariant FileListModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) - return QVariant(); + return {}; - if (index.row() >= fileList.size() || index.row() < 0) - return QVariant(); + const int row = index.row(); + if (row >= fileList.size() || row < 0) + return {}; - if (role == Qt::DisplayRole) { - return fileList.at(index.row()); - } else if (role == Qt::BackgroundRole) { - int batch = (index.row() / 100) % 2; - if (batch == 0) - return qApp->palette().base(); - else - return qApp->palette().alternateBase(); + switch (role) { + case Qt::DisplayRole: + return fileList.at(row).fileName(); + case Qt::BackgroundRole: { + const int batch = row / batchSize; + const QPalette &palette = QGuiApplication::palette(); + return (batch % 2) != 0 ? palette.alternateBase() : palette.base(); } - return QVariant(); + case Qt::DecorationRole: + return iconProvider.icon(fileList.at(row)); + } + return {}; } + //![4] +QFileInfo FileListModel::fileInfoAt(const QModelIndex &index) const +{ + return fileList.at(index.row()); +} + //![1] bool FileListModel::canFetchMore(const QModelIndex &parent) const { @@ -99,19 +110,20 @@ void FileListModel::fetchMore(const QModelIndex &parent) { if (parent.isValid()) return; - int remainder = fileList.size() - fileCount; - int itemsToFetch = qMin(100, remainder); + const int start = fileCount; + const int remainder = int(fileList.size()) - start; + const int itemsToFetch = qMin(batchSize, remainder); if (itemsToFetch <= 0) return; - beginInsertRows(QModelIndex(), fileCount, fileCount + itemsToFetch - 1); + beginInsertRows(QModelIndex(), start, start + itemsToFetch - 1); fileCount += itemsToFetch; endInsertRows(); - emit numberPopulated(itemsToFetch); + emit numberPopulated(path, start, itemsToFetch, int(fileList.size())); } //![2] @@ -121,7 +133,8 @@ void FileListModel::setDirPath(const QString &path) QDir dir(path); beginResetModel(); - fileList = dir.entryList(); + this->path = path; + fileList = dir.entryInfoList(QDir::NoDot | QDir::AllEntries, QDir::Name); fileCount = 0; endResetModel(); } diff --git a/examples/widgets/itemviews/fetchmore/filelistmodel.h b/examples/widgets/itemviews/fetchmore/filelistmodel.h index 35cf6f7b461..1cd61f8c8ed 100644 --- a/examples/widgets/itemviews/fetchmore/filelistmodel.h +++ b/examples/widgets/itemviews/fetchmore/filelistmodel.h @@ -52,7 +52,8 @@ #define FILELISTMODEL_H #include -#include +#include +#include //![0] class FileListModel : public QAbstractListModel @@ -65,8 +66,10 @@ public: int rowCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QFileInfo fileInfoAt(const QModelIndex &) const; + signals: - void numberPopulated(int number); + void numberPopulated(const QString &path, int start, int number, int total); public slots: void setDirPath(const QString &path); @@ -76,8 +79,10 @@ protected: void fetchMore(const QModelIndex &parent) override; private: - QStringList fileList; - int fileCount; + QFileInfoList fileList; + QString path; + QFileIconProvider iconProvider; + int fileCount = 0; }; //![0] diff --git a/examples/widgets/itemviews/fetchmore/window.cpp b/examples/widgets/itemviews/fetchmore/window.cpp index fa23bddc736..64746c18f8b 100644 --- a/examples/widgets/itemviews/fetchmore/window.cpp +++ b/examples/widgets/itemviews/fetchmore/window.cpp @@ -56,37 +56,43 @@ Window::Window(QWidget *parent) : QWidget(parent) { - FileListModel *model = new FileListModel(this); - model->setDirPath(QLibraryInfo::path(QLibraryInfo::PrefixPath)); + model = new FileListModel(this); + model->setDirPath(QDir::rootPath()); - QLabel *label = new QLabel(tr("&Directory:")); - QLineEdit *lineEdit = new QLineEdit; - label->setBuddy(lineEdit); - - QListView *view = new QListView; + view = new QListView; view->setModel(model); - logViewer = new QTextBrowser(this); - logViewer->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred)); + logViewer = new QPlainTextEdit(this); + logViewer->setReadOnly(true); + logViewer->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, + QSizePolicy::Preferred)); - connect(lineEdit, &QLineEdit::textChanged, - model, &FileListModel::setDirPath); - connect(lineEdit, &QLineEdit::textChanged, - logViewer, &QTextEdit::clear); connect(model, &FileListModel::numberPopulated, this, &Window::updateLog); + connect(view, &QAbstractItemView::activated, + this, &Window::activated); - QGridLayout *layout = new QGridLayout; - layout->addWidget(label, 0, 0); - layout->addWidget(lineEdit, 0, 1); - layout->addWidget(view, 1, 0, 1, 2); - layout->addWidget(logViewer, 2, 0, 1, 2); + auto *layout = new QVBoxLayout(this); + layout->addWidget(view); + layout->addWidget(logViewer); - setLayout(layout); setWindowTitle(tr("Fetch More Example")); } -void Window::updateLog(int number) +void Window::updateLog(const QString &path, int start, int number, int total) { - logViewer->append(tr("%1 items added.").arg(number)); + const int last = start + number - 1; + const QString nativePath = QDir::toNativeSeparators(path); + const QString message = tr("%1..%2/%3 items from \"%4\" added.") + .arg(start).arg(last).arg(total).arg(nativePath); + logViewer->appendPlainText(message); +} + +void Window::activated(const QModelIndex &index) +{ + const QFileInfo fi = model->fileInfoAt(index); + if (fi.isDir()) { + logViewer->clear(); + model->setDirPath(fi.absoluteFilePath()); + } } diff --git a/examples/widgets/itemviews/fetchmore/window.h b/examples/widgets/itemviews/fetchmore/window.h index 61bcb94bde6..1f7c2a8728a 100644 --- a/examples/widgets/itemviews/fetchmore/window.h +++ b/examples/widgets/itemviews/fetchmore/window.h @@ -54,9 +54,13 @@ #include QT_BEGIN_NAMESPACE -class QTextBrowser; +class QModelIndex; +class QListView; +class QPlainTextEdit; QT_END_NAMESPACE +class FileListModel; + class Window : public QWidget { Q_OBJECT @@ -65,10 +69,13 @@ public: Window(QWidget *parent = nullptr); public slots: - void updateLog(int number); + void updateLog(const QString &path, int start, int number, int total); + void activated(const QModelIndex &); private: - QTextBrowser *logViewer; + QPlainTextEdit *logViewer; + FileListModel *model; + QListView *view; }; #endif // WINDOW_H