Qt - доступ к пути пакета - PullRequest
3 голосов
/ 16 августа 2010

Страница документации Qt " Mac Differences " предоставляет следующий код для доступа к пути пакета приложения:

CFURLRef appUrlRef = CFBundleCopyBundleURL(CFBundleGetMainBundle());
CFStringRef macPath = CFURLCopyFileSystemPath(appUrlRef, kCFURLPOSIXPathStyle);
const char *pathPtr = CFStringGetCStringPtr(macPath,CFStringGetSystemEncoding());
qDebug("Path = %s", pathPtr);
CFRelease(appUrlRef);
CFRelease(macPath);

Однако, в чем преимущество этого, по сравнению с чем-то более простым, напримерследующее:

QDir dir = QDir(QCoreApplication::applicationDirPath());
dir.cdUp();
dir.cdUp();
return dir;

Ответы [ 2 ]

3 голосов
/ 16 августа 2010

Никогда не используйте первый код .Как написано в документации по Qt, она может не работать в неанглийской среде из-за того, что кодировка имени файла не равна CFStringGetSystemEncoding(), что возвращает основную не-юникодную кодировку пользователя.Вместо этого имя файла всегда кодируется UTF8 (с небольшим вариантом.)

const char *pathPtr = CFStringGetCStringPtr(macPath, kCFStringEncodingUTF8);

Точнее, вам нужно использовать CFStringGetFileSystemRepresentation.

QCoreApplication::applicationDirPath() (в основном) правильно учитывает эти тонкости, поэтому вам следует использовать последний подход, если вы хотите, чтобы ваше приложение работало на неанглийских компьютерах Mac.

1 голос
/ 23 июля 2016

Современный способ с Qt 5 и OS X 10.9 или выше:

CFURLRef url = (CFURLRef)CFAutorelease((CFURLRef)CFBundleCopyBundleURL(CFBundleGetMainBundle()));
QString path = QUrl::fromCFURL(url).path();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...