From 0c4d31d8c9cdab18743bde17de5ea0bd0daf02e5 Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Tue, 9 May 2017 12:42:18 +0200 Subject: Improve the findfiles example: use QDirIterator, etc It hasn't been necessary for a long time now to write the recursive file-find function manually. It has just been an obscurely documented feature of QDirIterator for far too long. Demonstrate the new QLocale::formattedDataSize() function. Also sync up the qdoc description of this example with the recent changes. Change-Id: I9c2bb15bb5ec353d38181b160f0be198774cbea2 Reviewed-by: Robin Burchell Reviewed-by: Shawn Rutledge --- examples/widgets/dialogs/findfiles/window.cpp | 57 +++++++++++---------------- examples/widgets/dialogs/findfiles/window.h | 2 +- 2 files changed, 24 insertions(+), 35 deletions(-) (limited to 'examples/widgets/dialogs/findfiles') diff --git a/examples/widgets/dialogs/findfiles/window.cpp b/examples/widgets/dialogs/findfiles/window.cpp index f2ce853d99..1b16cdcd35 100644 --- a/examples/widgets/dialogs/findfiles/window.cpp +++ b/examples/widgets/dialogs/findfiles/window.cpp @@ -74,6 +74,7 @@ static inline void openFile(const QString &fileName) Window::Window(QWidget *parent) : QWidget(parent) { + setWindowTitle(tr("Find Files")); QPushButton *browseButton = new QPushButton(tr("&Browse..."), this); connect(browseButton, &QAbstractButton::clicked, this, &Window::browse); findButton = new QPushButton(tr("&Find"), this); @@ -92,9 +93,7 @@ Window::Window(QWidget *parent) filesFoundLabel = new QLabel; createFilesTable(); -//! [0] -//! [1] QGridLayout *mainLayout = new QGridLayout(this); mainLayout->addWidget(new QLabel(tr("Named:")), 0, 0); mainLayout->addWidget(fileComboBox, 0, 1, 1, 2); @@ -106,12 +105,13 @@ Window::Window(QWidget *parent) mainLayout->addWidget(filesTable, 3, 0, 1, 3); mainLayout->addWidget(filesFoundLabel, 4, 0, 1, 2); mainLayout->addWidget(findButton, 4, 2); +//! [0] - setWindowTitle(tr("Find Files")); - const QRect screenGeometry = QApplication::desktop()->screenGeometry(this); - resize(screenGeometry.width() / 2, screenGeometry.height() / 3); -} //! [1] + connect(new QShortcut(QKeySequence::Quit, this), &QShortcut::activated, + qApp, &QApplication::quit); +//! [1] +} //! [2] void Window::browse() @@ -133,21 +133,7 @@ static void updateComboBox(QComboBox *comboBox) comboBox->addItem(comboBox->currentText()); } -//! [13] - -static void findRecursion(const QString &path, const QString &pattern, QStringList *result) -{ - QDir currentDir(path); - const QString prefix = path + QLatin1Char('/'); - foreach (const QString &match, currentDir.entryList(QStringList(pattern), QDir::Files | QDir::NoSymLinks)) - result->append(prefix + match); - foreach (const QString &dir, currentDir.entryList(QDir::Dirs | QDir::NoSymLinks | QDir::NoDotAndDotDot)) - findRecursion(prefix + dir, pattern, result); -} - -//! [13] //! [3] - void Window::find() { filesTable->setRowCount(0); @@ -155,6 +141,7 @@ void Window::find() QString fileName = fileComboBox->currentText(); QString text = textComboBox->currentText(); QString path = QDir::cleanPath(directoryComboBox->currentText()); + currentDir = QDir(path); //! [3] updateComboBox(fileComboBox); @@ -162,12 +149,16 @@ void Window::find() updateComboBox(directoryComboBox); //! [4] - - currentDir = QDir(path); + QStringList filter; + if (!fileName.isEmpty()) + filter << fileName; + QDirIterator it(path, filter, QDir::AllEntries | QDir::NoSymLinks | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); QStringList files; - findRecursion(path, fileName.isEmpty() ? QStringLiteral("*") : fileName, &files); + while (it.hasNext()) + files << it.next(); if (!text.isEmpty()) files = findFiles(files, text); + files.sort(); showFiles(files); } //! [4] @@ -225,20 +216,18 @@ QStringList Window::findFiles(const QStringList &files, const QString &text) //! [7] //! [8] -void Window::showFiles(const QStringList &files) +void Window::showFiles(const QStringList &paths) { - for (int i = 0; i < files.size(); ++i) { - const QString &fileName = files.at(i); - const QString toolTip = QDir::toNativeSeparators(fileName); - const QString relativePath = QDir::toNativeSeparators(currentDir.relativeFilePath(fileName)); - const qint64 size = QFileInfo(fileName).size(); + for (const QString &filePath : paths) { + const QString toolTip = QDir::toNativeSeparators(filePath); + const QString relativePath = QDir::toNativeSeparators(currentDir.relativeFilePath(filePath)); + const qint64 size = QFileInfo(filePath).size(); QTableWidgetItem *fileNameItem = new QTableWidgetItem(relativePath); - fileNameItem->setData(absoluteFileNameRole, QVariant(fileName)); + fileNameItem->setData(absoluteFileNameRole, QVariant(filePath)); fileNameItem->setToolTip(toolTip); fileNameItem->setFlags(fileNameItem->flags() ^ Qt::ItemIsEditable); - QTableWidgetItem *sizeItem = new QTableWidgetItem(tr("%1 KB") - .arg(int((size + 1023) / 1024))); - sizeItem->setData(absoluteFileNameRole, QVariant(fileName)); + QTableWidgetItem *sizeItem = new QTableWidgetItem(QLocale().formattedDataSize(size)); + sizeItem->setData(absoluteFileNameRole, QVariant(filePath)); sizeItem->setToolTip(toolTip); sizeItem->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); sizeItem->setFlags(sizeItem->flags() ^ Qt::ItemIsEditable); @@ -248,7 +237,7 @@ void Window::showFiles(const QStringList &files) filesTable->setItem(row, 0, fileNameItem); filesTable->setItem(row, 1, sizeItem); } - filesFoundLabel->setText(tr("%n file(s) found (Double click on a file to open it)", 0, files.size())); + filesFoundLabel->setText(tr("%n file(s) found (Double click on a file to open it)", 0, paths.size())); filesFoundLabel->setWordWrap(true); } //! [8] diff --git a/examples/widgets/dialogs/findfiles/window.h b/examples/widgets/dialogs/findfiles/window.h index fe217381e2..949df704bb 100644 --- a/examples/widgets/dialogs/findfiles/window.h +++ b/examples/widgets/dialogs/findfiles/window.h @@ -79,7 +79,7 @@ private slots: private: QStringList findFiles(const QStringList &files, const QString &text); - void showFiles(const QStringList &files); + void showFiles(const QStringList &paths); QComboBox *createComboBox(const QString &text = QString()); void createFilesTable(); -- cgit v1.2.3