簡體   English   中英

重用Qt 5中的現有QDirIterator

[英]Reuse existing QDirIterator in Qt 5

我在Qt 5項目的單個范圍內使用多個QDirIterator 它們通常如下所示:

QDirIterator i(QDir::currentPath(), QDir::Dirs | QDir::NoDotAndDotDot);
while (i.hasNext()) {
    doSomething();
};

現在,我使用多個具有各自名稱( i0i1i2等)的對象,並且我想知道如何在整個項目中僅使用一個名稱,在本示例中為i 我應該如何停用現有的QDirIterator以重用它?

C ++允許您在需要的任何地方引入新范圍,例如:

{
  QDirIterator i(path1, QDir::Dirs | QDir::NoDotAndDotDot);
  while (i.hasNext()) {
    doSomething();
  };
}
{
  QDirIterator i(path2, QDir::Dirs | QDir::NoDotAndDotDot);
  while (i.hasNext()) {
    doSomething();
  };
}

您可以對QDirIterator實施正向順序迭代器適配器:

// https://github.com/KubaO/stackoverflown/tree/master/questions/dir-iterator-39133673
#include <QtCore>
#include <boost/optional.hpp>
#include <boost/iterator/iterator_facade.hpp>

class QDir_iterator : public
        boost::iterator_facade<QDir_iterator, QString,
        boost::forward_traversal_tag, QString>
{
    friend class boost::iterator_core_access;
    boost::optional<QDirIterator &> it;
    bool equal(const QDir_iterator & other) const {
        return **this == *other;
    }
    QString dereference() const {
        return it != boost::none ? it->filePath() : QString{};
    }
    void increment() {
        it->next();
    }
public:
    QDir_iterator() = default;
    QDir_iterator(QDirIterator & dir) : it{dir} {
        it->next();
    }
};

QDir_iterator begin(QDirIterator & dir) { return QDir_iterator{dir}; }
QDir_iterator end(QDirIterator &) { return QDir_iterator{}; }

該適配器可在QDirIterator上使用,因此您可以將QDirIterator直接傳遞給以下對象:

void test1() {
    auto curr = QDir::current();
    auto entries = curr.entryList();
    int i = 0;
    for (auto dir : QDirIterator{curr}) ++i;
    Q_ASSERT(i == entries.count());
}

您當然可以將任何必要的標志或過濾器傳遞給QDirIterator 適配器將跟隨它們。

如果您對Boost過敏,則可以排除迭代目錄以“保存”必須處理支撐范圍的情況:

template <typename F>
void iterate(QDirIterator && it, F && fun) {
     while (it.hasNext())
        fun(it.next());
}

迭代使用一個臨時迭代器-統一初始化使其非常輕松:

void test2() {
    auto curr = QDir::current();
    auto entries = curr.entryList();
    int i = 0, j = 0;
    iterate({curr}, [&](const QString &){ ++i; });
    Q_ASSERT(entries.length() == i);
    iterate({curr}, [&](const QString &){ ++j; });
    Q_ASSERT(entries.length() == j);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM