it-swarm.asia

الحصول على دليل العمل الحالي في تطبيق كيو تي

أنا أكتب برنامجًا في لغة C++ باستخدام مكتبة Qt. يوجد رابط رمزي في دليل bin home إلى الملف القابل للتنفيذ. أرغب في أن يكون دليل العمل الحالي لبرنامجي هو الدليل الذي أكون فيه مع جهاز طرفي (أي نتيجة الأمر pwd). لقد رأيت الدالة QDir::currentPath() ، لكنها تعيد الدليل حيث يوجد الثنائي.

كيف يمكنني العثور على دليل العمل الحالي الخاص بي؟

65
Geoffroy

شكرا لك RedX و Kaz على إجاباتك. أنا لا أفهم لماذا يعطي لي مسار إكس. لقد وجدت طريقة أخرى للقيام بذلك:

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

إنه أقل أناقة من سطر واحد ... لكنه يعمل لي.

3
Geoffroy

تم اختباره للتو و QDir::currentPath() ارجاع المسار الذي اتصلت به للتنفيذ.

والارتباط لا "موجود". إذا كنت تقوم بتنفيذ exe من هذا المسار ، فأنت تنفذه بشكل فعال من المسار الذي يشير إليه symlink.

87
RedX

هل جربت QCoreApplication :: applicationDirPath ()

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

للإضافة إلى إجابة KaZ ، كلما أقوم بإنشاء تطبيق QML ، أميل إلى إضافة هذا إلى 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();
}

استخدامه في QML

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

أقوم بتشغيل Qt 5.5 ضمن Windows ويبدو أن المُنشئ الافتراضي لـ QDir يلتقط دليل العمل الحالي ، وليس دليل التطبيق.

لست متأكدًا مما إذا كان برنامج getenv PWD سيعمل عبر النظام الأساسي وأعتقد أنه تم ضبطه على دليل العمل الحالي عندما أطلقت Shell التطبيق ولا تتضمن أي تغييرات في دليل العمل يتم إجراؤها بواسطة التطبيق نفسه (والذي قد يكون السبب البروتوكول الاختياري يرى هذا السلوك).

لذلك اعتقدت أنني سأضيف بعض الطرق الأخرى التي يجب أن توفر لك دليل العمل الحالي (وليس الموقع الثنائي للتطبيق):

// 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