首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何遍历QStringList

如何遍历QStringList
EN

Stack Overflow用户
提问于 2017-06-15 04:28:55
回答 1查看 31.2K关注 0票数 14

我试图遍历两个不同的目录。这两个目录位于同一个根/上。

代码语言:javascript
复制
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";中的第一个目录dirs << "plugins" << "core_plugs";插件。对于重新排序的dirs << "core_plugs" << "plugins";,结果是相同的,只有第一个目录core_plugs被解析。

为什么我会有这种行为,以及如何使它在两个目录中迭代。

更新

代码语言:javascript
复制
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();
    }
}

按照阿齐姆的建议,我更新了我的尝试,如上面所示。

代码语言:javascript
复制
foreach() {} pluginsDir.cdUp(); 

但是它不会被抓到。那里太晚了。而且我得到的迭代次数太少了。你能建议我怎么做才能特别好吗?

谢谢你的回应!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-15 04:56:34

下面是如何使用C++11的QStringList来迭代循环播放

代码语言:javascript
复制
const QStringList list { "A", "B", "C" };

for ( const auto& i : list  )
{
    qDebug() << i;
}

但是,我相信你的问题不是迭代。您的问题是,您正在cd进入一个目录,但没有退出它,即cd("..")cdUp()

正如您所说的,这两个目录位于相同的路径上,即根/。因此,在嵌套循环中进行处理之后,您需要返回到根路径来访问另一个目录。

您可以简单地检查cd函数的结果是否成功。它是一个布尔函数。但是,在您的情况下,错误处理是缺少的。对于错误处理,应该如下所示:

代码语言:javascript
复制
if ( dir.cd( path ) )
{
    // Do something here...
}

您不必为dirs.at(i).toLocal8Bit().constData()函数获取cd。它需要一个QString

这是它的签名:

代码语言:javascript
复制
bool QDir::cd( const QString& dirName );

提示:您还可以使用QDirIterator来迭代目录。

下面是一个完整的工作示例。

我遵循了这个目录结构

代码语言:javascript
复制
C:\Test
-- A
---- a.txt
-- B
---- b.txt

代码语言:javascript
复制
#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;
}

输出

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44558568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档