it-swarm.it

Ottieni la directory di lavoro corrente in un'applicazione Qt

Sto scrivendo un programma in C++ usando la libreria Qt. C'è un collegamento simbolico nella mia cartella home bin all'eseguibile. Vorrei che l'attuale directory di lavoro del mio programma fosse la directory in cui mi trovo con il mio terminale (cioè il risultato del comando pwd). Ho visto la funzione QDir::currentPath(), ma restituisce la directory in cui si trova il binario.

Come posso trovare la mia directory di lavoro attuale?

67
Geoffroy

Grazie RedX e Kaz per le tue risposte. Non capisco perché da me dia il percorso dell'exe. Ho trovato un altro modo per farlo:

QString pwd("");
char * PWD;
PWD = getenv ("PWD");
pwd.append(PWD);
cout << "Working directory : " << pwd << flush;

È meno elegante di una singola linea ... ma funziona per me.

3
Geoffroy

Appena testato e QDir::currentPath() restituisce il percorso da cui ho chiamato il mio eseguibile.

E un collegamento simbolico non "esiste". Se stai eseguendo un exe da quel percorso, lo stai effettivamente eseguendo dal percorso a cui punta il collegamento simbolico.

90
RedX

Hai provato QCoreApplication :: applicationDirPath ()

qDebug() << "App path : " << qApp->applicationDirPath();
52
KaZ

Per aggiungere alla risposta KaZ, ogni volta che sto facendo un'applicazione QML tendo ad aggiungere questo al c ++ principale

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QStandardPaths>

int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;

// get the applications dir path and expose it to QML 

QUrl appPath(QString("%1").arg(app.applicationDirPath()));
engine.rootContext()->setContextProperty("appPath", appPath);


// Get the QStandardPaths home location and expose it to QML 
QUrl userPath;
   const QStringList usersLocation = QStandardPaths::standardLocations(QStandardPaths::HomeLocation);
   if (usersLocation.isEmpty())
       userPath = appPath.resolved(QUrl("/home/"));
   else
      userPath = QString("%1").arg(usersLocation.first());
   engine.rootContext()->setContextProperty("userPath", userPath);

   QUrl imagePath;
      const QStringList picturesLocation = QStandardPaths::standardLocations(QStandardPaths::PicturesLocation);
      if (picturesLocation.isEmpty())
          imagePath = appPath.resolved(QUrl("images"));
      else
          imagePath = QString("%1").arg(picturesLocation.first());
      engine.rootContext()->setContextProperty("imagePath", imagePath);

      QUrl videoPath;
      const QStringList moviesLocation = QStandardPaths::standardLocations(QStandardPaths::MoviesLocation);
      if (moviesLocation.isEmpty())
          videoPath = appPath.resolved(QUrl("./"));
      else
          videoPath = QString("%1").arg(moviesLocation.first());
      engine.rootContext()->setContextProperty("videoPath", videoPath);

      QUrl homePath;
      const QStringList homesLocation = QStandardPaths::standardLocations(QStandardPaths::HomeLocation);
      if (homesLocation.isEmpty())
          homePath = appPath.resolved(QUrl("/"));
      else
          homePath = QString("%1").arg(homesLocation.first());
      engine.rootContext()->setContextProperty("homePath", homePath);

      QUrl desktopPath;
      const QStringList desktopsLocation = QStandardPaths::standardLocations(QStandardPaths::DesktopLocation);
      if (desktopsLocation.isEmpty())
          desktopPath = appPath.resolved(QUrl("/"));
      else
          desktopPath = QString("%1").arg(desktopsLocation.first());
      engine.rootContext()->setContextProperty("desktopPath", desktopPath);

      QUrl docPath;
      const QStringList docsLocation = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation);
      if (docsLocation.isEmpty())
          docPath = appPath.resolved(QUrl("/"));
      else
          docPath = QString("%1").arg(docsLocation.first());
      engine.rootContext()->setContextProperty("docPath", docPath);


      QUrl tempPath;
      const QStringList tempsLocation = QStandardPaths::standardLocations(QStandardPaths::TempLocation);
      if (tempsLocation.isEmpty())
          tempPath = appPath.resolved(QUrl("/"));
      else
          tempPath = QString("%1").arg(tempsLocation.first());
      engine.rootContext()->setContextProperty("tempPath", tempPath);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}

Usandolo in QML

....
........
............
Text{
text:"This is the applications path: " + appPath
+ "\nThis is the users home directory: " + homePath
+ "\nThis is the Desktop path: " desktopPath;
}
9
joseph

Sto eseguendo Qt 5.5 in Windows e il costruttore predefinito di QDir sembra raccogliere l'attuale directory di lavoro, non la directory dell'applicazione.

Non sono sicuro se il PWD getenv funzionerà su più piattaforme e penso che sia impostato sulla directory di lavoro corrente quando Shell ha avviato l'applicazione e non include eventuali modifiche alla directory di lavoro eseguite dall'app stessa (che potrebbe essere il motivo l'OP sta vedendo questo comportamento).

Quindi ho pensato di aggiungere altri modi che dovrebbero darti la directory di lavoro corrente (non la posizione binaria dell'applicazione):

// using where a relative filename will end up
QFileInfo fi("temp");
cout << fi.absolutePath() << endl;

// explicitly using the relative name of the current working directory
QDir dir(".");
cout << dir.absolutePath() << endl;
3
Mark Walker