Qt - 访问包路径

Jak*_*les 5 c++ macos qt

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)

Yuj*_*uji 5

切勿使用第一个代码。正如 Qt 文档中所写,它可能无法在非英语环境中工作,因为文件名编码不是 by CFStringGetSystemEncoding(),它返回用户的主要非 unicode 编码。相反,文件名始终由 UTF8 编码(有一个细微的变体。)

const char *pathPtr = CFStringGetCStringPtr(macPath, kCFStringEncodingUTF8);
Run Code Online (Sandbox Code Playgroud)

更准确地说,您需要使用CFStringGetFileSystemRepresentation.

QCoreApplication::applicationDirPath()(大部分)正确地考虑到了这些微妙之处,因此如果您希望您的应用程序在非英语 Mac 上运行,您应该使用后一种方法。


kai*_*jow 1

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)