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);
Run Code Online (Sandbox Code Playgroud)
然而,与更简单的东西相比,它有什么优点,如下所示:
QDir dir = QDir(QCoreApplication::applicationDirPath());
dir.cdUp();
dir.cdUp();
return dir;
Run Code Online (Sandbox Code Playgroud)
切勿使用第一个代码。正如 Qt 文档中所写,它可能无法在非英语环境中工作,因为文件名编码不是 by CFStringGetSystemEncoding(),它返回用户的主要非 unicode 编码。相反,文件名始终由 UTF8 编码(有一个细微的变体。)
const char *pathPtr = CFStringGetCStringPtr(macPath, kCFStringEncodingUTF8);
Run Code Online (Sandbox Code Playgroud)
更准确地说,您需要使用CFStringGetFileSystemRepresentation.
QCoreApplication::applicationDirPath()(大部分)正确地考虑到了这些微妙之处,因此如果您希望您的应用程序在非英语 Mac 上运行,您应该使用后一种方法。
Qt 5 和 OS X 10.9 或更高版本的现代方式是:
CFURLRef url = (CFURLRef)CFAutorelease((CFURLRef)CFBundleCopyBundleURL(CFBundleGetMainBundle()));
QString path = QUrl::fromCFURL(url).path();
Run Code Online (Sandbox Code Playgroud)