如何遍历QStringList

时间:2017-06-15 04:28:56

标签: c++ qt iteration qstring qlist

我正在尝试遍历两个不同的目录。这两个目录位于同一个根Low上。

/

我只能进入列表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";,结果是相同的,只解析第一个目录 core_plugs

为什么我会遇到这种行为,如何让它遍历两个目录。

更新

dirs << "core_plugs" << "plugins";

根据Azeem的建议,我更新了我的尝试,如上所示。我在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(); } } 之后尝试cdUp();,即:

foreach

但是,它并没有被抓住。现在为时已晚。比这更早,我得到的迭代太少了。能否请您建议我如何特别关注它?

感谢您的回复!

1 个答案:

答案 0 :(得分:9)

以下是使用C ++ 11 QStringList迭代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...
}

您不必为dirs.at(i).toLocal8Bit().constData()功能获取cd。需要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;
}

<强>输出

enter image description here