Get current working directory in a Qt application

后端 未结 5 1661
春和景丽
春和景丽 2020-12-04 23:13

I\'m writing a program in C++ using the Qt library. There is a symbolic link in my home bin directory to the executable. I would like the current working directory of my pro

相关标签:
5条回答
  • 2020-12-04 23:51

    To add on to KaZ answer, Whenever I am making a QML application I tend to add this to the main c++

    #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();
    }
    

    Using it in QML

    ....
    ........
    ............
    Text{
    text:"This is the applications path: " + appPath
    + "\nThis is the users home directory: " + homePath
    + "\nThis is the Desktop path: " desktopPath;
    }
    
    0 讨论(0)
  • 2020-12-04 23:59

    Thank you RedX and Kaz for your answers. I don't get why by me it gives the path of the exe. I found an other way to do it :

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

    It is less elegant than a single line... but it works for me.

    0 讨论(0)
  • 2020-12-05 00:03

    I'm running Qt 5.5 under Windows and the default constructor of QDir appears to pick up the current working directory, not the application directory.

    I'm not sure if the getenv PWD will work cross-platform and I think it is set to the current working directory when the shell launched the application and doesn't include any working directory changes done by the app itself (which might be why the OP is seeing this behavior).

    So I thought I'd add some other ways that should give you the current working directory (not the application's binary location):

    // 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;
    
    0 讨论(0)
  • 2020-12-05 00:15

    Just tested and QDir::currentPath() does return the path from which I called my executable.

    And a symlink does not "exist". If you are executing an exe from that path you are effectively executing it from the path the symlink points to.

    0 讨论(0)
  • 2020-12-05 00:16

    Have you tried QCoreApplication::applicationDirPath()

    qDebug() << "App path : " << qApp->applicationDirPath();
    
    0 讨论(0)
提交回复
热议问题