如何遍历 QStringList
How to iterate through a QStringList
我正在尝试遍历两个不同的目录。这两个目录在同一个根 /
上。
void MainWindow::loadPlugins()
{
pluginsDir = QDir(qApp -> applicationDirPath());
#if defined(Q_OS_WIN)
if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release")
pluginsDir.cdUp();
#elif defined(Q_OS_MAC)
if (pluginsDir.dirName() == "MacOS") {
pluginsDir.cdUp();
pluginsDir.cdUp();
pluginsDir.cdUp();
}
#endif
QStringList dirs;
dirs << "plugins" << "core_plugs";
QList<QObject *> loadedPlugs;
for (int i = 0; i < dirs.size(); ++i)
{
cout << dirs.at(i).toLocal8Bit().constData() << endl;
pluginsDir.cd(dirs.at(i).toLocal8Bit().constData());
foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
QObject *plugin = loader.instance();
qDebug() << "NAME :: " << fileName;
if (plugin && !(loadedPlugs . contains(plugin))) {
loadedPlugs << plugin;
dirs . removeAt(i);
} else {
continue;
}
}
}
}
我只能进入列表 dirs << "plugins" << "core_plugs";
中的第一个目录 plugins。重新排序dirs << "core_plugs" << "plugins";
,结果是一样的,只解析第一个目录,core_plugs。
为什么我会出现这种行为,如何让它遍历两个目录。
更新
void MainWindow::loadPlugins()
{
pluginsDir = QDir(qApp -> applicationDirPath());
#if defined(Q_OS_WIN)
if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release")
pluginsDir.cdUp();
#elif defined(Q_OS_MAC)
if (pluginsDir.dirName() == "MacOS") {
pluginsDir.cdUp();
pluginsDir.cdUp();
pluginsDir.cdUp();
}
#endif
QStringList dirs;
dirs << "plugins" << "core_plugs";
QList<QObject *> loadedPlugs;
for (int i = 0; i < dirs.size(); ++i)
{
pluginsDir.cd(dirs.at(i).toLocal8Bit().constData());
foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
QObject *plugin = loader.instance();
if (plugin && !(loadedPlugs . contains(plugin))) {
populateRevPlugins(plugin);
loadedPlugs << plugin;
}
}
qDebug() << pluginsDir . absolutePath();
pluginsDir.cdUp();
qDebug() << pluginsDir . absolutePath();
}
}
根据 Azeem 的建议,我更新了我的尝试,如上所示。我在 foreach
之后尝试 cdUp();
即:
foreach() {} pluginsDir.cdUp();
但是,它并没有被抓到。那里太晚了。早于此,我得到的迭代太少。你能建议我如何特别去做吗?
感谢您的回复!
以下是如何遍历 QStringList
using C++11's range-based for
loop:
const QStringList list { "A", "B", "C" };
for ( const auto& i : list )
{
qDebug() << i;
}
但是,我相信你的问题不是迭代。你的问题是你正在 cd
进入一个目录但没有离开它,即 cd("..")
或 cdUp()
.
正如您所说,这两个目录位于同一路径,即根目录 /
。
所以,在嵌套循环处理后,需要回到根路径访问其他目录。
您可以简单地检查cd
函数的结果是否成功。它是一个布尔函数。但是,在您的情况下,缺少错误处理。有了错误处理,应该是这样的:
if ( dir.cd( path ) )
{
// Do something here...
}
您不必为 cd
函数获取 dirs.at(i).toLocal8Bit().constData()
。它需要 QString
.
这是它的签名:
bool QDir::cd( const QString& dirName );
提示:
您还可以使用 QDirIterator 来迭代目录。
下面是一个完整的工作示例。
我遵循了这个目录结构:
C:\Test
-- A
---- a.txt
-- B
---- b.txt
代码:
#include <QStringList>
#include <QDebug>
#include <QDir>
#include <cstdlib>
int main( void )
{
const QString root { "C:/Test" };
const QStringList dirs { "A", "B" };
QDir rootDir { root };
qDebug() << "Root Path:" << rootDir.absolutePath();
qDebug() << "Root List:" << rootDir.entryList( QDir::Dirs ) << '\n';
for ( const auto& dir : dirs )
{
if ( rootDir.cd( dir ) )
{
qDebug() << "Dir Path:" << rootDir.absolutePath();
qDebug() << "Dir List:" << rootDir.entryList( QDir::Files ) << '\n';
}
rootDir.cdUp();
qDebug() << "cding...";
qDebug() << "Dir Path:" << rootDir.absolutePath() << '\n';
}
return EXIT_SUCCESS;
}
输出:
我正在尝试遍历两个不同的目录。这两个目录在同一个根 /
上。
void MainWindow::loadPlugins()
{
pluginsDir = QDir(qApp -> applicationDirPath());
#if defined(Q_OS_WIN)
if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release")
pluginsDir.cdUp();
#elif defined(Q_OS_MAC)
if (pluginsDir.dirName() == "MacOS") {
pluginsDir.cdUp();
pluginsDir.cdUp();
pluginsDir.cdUp();
}
#endif
QStringList dirs;
dirs << "plugins" << "core_plugs";
QList<QObject *> loadedPlugs;
for (int i = 0; i < dirs.size(); ++i)
{
cout << dirs.at(i).toLocal8Bit().constData() << endl;
pluginsDir.cd(dirs.at(i).toLocal8Bit().constData());
foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
QObject *plugin = loader.instance();
qDebug() << "NAME :: " << fileName;
if (plugin && !(loadedPlugs . contains(plugin))) {
loadedPlugs << plugin;
dirs . removeAt(i);
} else {
continue;
}
}
}
}
我只能进入列表 dirs << "plugins" << "core_plugs";
中的第一个目录 plugins。重新排序dirs << "core_plugs" << "plugins";
,结果是一样的,只解析第一个目录,core_plugs。
为什么我会出现这种行为,如何让它遍历两个目录。
更新
void MainWindow::loadPlugins()
{
pluginsDir = QDir(qApp -> applicationDirPath());
#if defined(Q_OS_WIN)
if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release")
pluginsDir.cdUp();
#elif defined(Q_OS_MAC)
if (pluginsDir.dirName() == "MacOS") {
pluginsDir.cdUp();
pluginsDir.cdUp();
pluginsDir.cdUp();
}
#endif
QStringList dirs;
dirs << "plugins" << "core_plugs";
QList<QObject *> loadedPlugs;
for (int i = 0; i < dirs.size(); ++i)
{
pluginsDir.cd(dirs.at(i).toLocal8Bit().constData());
foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
QObject *plugin = loader.instance();
if (plugin && !(loadedPlugs . contains(plugin))) {
populateRevPlugins(plugin);
loadedPlugs << plugin;
}
}
qDebug() << pluginsDir . absolutePath();
pluginsDir.cdUp();
qDebug() << pluginsDir . absolutePath();
}
}
根据 Azeem 的建议,我更新了我的尝试,如上所示。我在 foreach
之后尝试 cdUp();
即:
foreach() {} pluginsDir.cdUp();
但是,它并没有被抓到。那里太晚了。早于此,我得到的迭代太少。你能建议我如何特别去做吗?
感谢您的回复!
以下是如何遍历 QStringList
using C++11's range-based for
loop:
const QStringList list { "A", "B", "C" };
for ( const auto& i : list )
{
qDebug() << i;
}
但是,我相信你的问题不是迭代。你的问题是你正在 cd
进入一个目录但没有离开它,即 cd("..")
或 cdUp()
.
正如您所说,这两个目录位于同一路径,即根目录 /
。
所以,在嵌套循环处理后,需要回到根路径访问其他目录。
您可以简单地检查cd
函数的结果是否成功。它是一个布尔函数。但是,在您的情况下,缺少错误处理。有了错误处理,应该是这样的:
if ( dir.cd( path ) )
{
// Do something here...
}
您不必为 cd
函数获取 dirs.at(i).toLocal8Bit().constData()
。它需要 QString
.
这是它的签名:
bool QDir::cd( const QString& dirName );
提示: 您还可以使用 QDirIterator 来迭代目录。
下面是一个完整的工作示例。
我遵循了这个目录结构:
C:\Test
-- A
---- a.txt
-- B
---- b.txt
代码:
#include <QStringList>
#include <QDebug>
#include <QDir>
#include <cstdlib>
int main( void )
{
const QString root { "C:/Test" };
const QStringList dirs { "A", "B" };
QDir rootDir { root };
qDebug() << "Root Path:" << rootDir.absolutePath();
qDebug() << "Root List:" << rootDir.entryList( QDir::Dirs ) << '\n';
for ( const auto& dir : dirs )
{
if ( rootDir.cd( dir ) )
{
qDebug() << "Dir Path:" << rootDir.absolutePath();
qDebug() << "Dir List:" << rootDir.entryList( QDir::Files ) << '\n';
}
rootDir.cdUp();
qDebug() << "cding...";
qDebug() << "Dir Path:" << rootDir.absolutePath() << '\n';
}
return EXIT_SUCCESS;
}
输出: