[英]QT How to access specific directory within subdirectories with a QDirIterator?
[英]Reuse existing QDirIterator in Qt 5
我在Qt 5項目的單個范圍內使用多個QDirIterator
。 它們通常如下所示:
QDirIterator i(QDir::currentPath(), QDir::Dirs | QDir::NoDotAndDotDot);
while (i.hasNext()) {
doSomething();
};
現在,我使用多個具有各自名稱( i0
, i1
, i2
等)的對象,並且我想知道如何在整個項目中僅使用一個名稱,在本示例中為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.