Ich versuche, durch zwei verschiedene Verzeichnisse zu iterieren. Die zwei Verzeichnisse befinden sich auf demselben Stamm /
.Wie man durch eine QStringList iteriert
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;
}
}
}
}
Ich bin nur in der Lage in das erste Verzeichnis in der Liste Plugins dirs << "plugins" << "core_plugs";
zu gehen. Bei einer Neubestellung dirs << "core_plugs" << "plugins";
sind die Ergebnisse identisch, und nur das erste Verzeichnis core_plugs wird geparst.
Warum bekomme ich dieses Verhalten, und wie kann ich es durch beide Verzeichnisse iterieren lassen.
UPDATE
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();
}
}
@ Vorschlag der Azeem Folge, ich meinen Versuch aktualisiert, wie oben gezeigt. Ich habe versucht, cdUp();
nach dem foreach
dh:
foreach() {} pluginsDir.cdUp();`
aber nicht verfängt. Es ist zu spät dort. Früher als das und ich bekomme zu wenige Wiederholungen. Könnten Sie mir bitte vorschlagen, wie ich das konkret machen kann?
Vielen Dank für die Antwort.
Warum ist es so spät? Und was meinst du mit "es wird nicht erwischt"? – Azeem
Ich kann nicht in das zweite Verzeichnis iterieren. Das 'pluginsDir.cdUp();' funktioniert, und das Verzeichnis ändert sich, aber es findet keine Iteration im zweiten Verzeichnis statt. Es scheint, als ob 'cdUp' nach Ablauf der Iteration passiert. –
Hier ist die abgespeckte Version Ihres Codes: http://ideone.com/H3qY81 und es funktioniert gut! Sie müssen 'cd' für die Fehlerbehandlung überprüfen. – Azeem