C++ Qt-访问包路径
Qt documentation“”页面提供了访问应用程序包路径的以下代码:C++ Qt-访问包路径,c++,macos,qt,C++,Macos,Qt,Qt documentation“”页面提供了访问应用程序包路径的以下代码: CFURLRef appUrlRef = CFBundleCopyBundleURL(CFBundleGetMainBundle()); CFStringRef macPath = CFURLCopyFileSystemPath(appUrlRef, kCFURLPOSIXPathStyle); const char *pathPtr = CFStringGetCStringPtr(macPath,CFStringGe
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;
切勿使用第一个代码。正如Qt文档中所述,由于文件名编码不是通过
CFStringGetSystemEncoding()
(返回用户的主要非unicode编码)进行的,因此它可能无法在非英语环境中工作。相反,文件名始终由UTF8编码(略有变化)
更准确地说,您需要使用
QCoreApplication::applicationDirPath()
(大部分)正确地考虑了这些细微之处,因此,如果您希望您的应用程序在非英语Mac上运行,您应该使用后一种方法。Qt 5和OS X 10.9或更高版本的现代方式是:
CFURLRef url = (CFURLRef)CFAutorelease((CFURLRef)CFBundleCopyBundleURL(CFBundleGetMainBundle()));
QString path = QUrl::fromCFURL(url).path();
有趣的。。。我想知道,尽管诺基亚存在问题,但为什么诺基亚会将其放在文档中?我相信我已经在文档的其他地方看到了第二种方式(或者在其中一个示例中),我想文档是很久以前写的一种非常古老的方式。代码本身使用(大部分)正确的方法,并且维护良好。您应该提交一份bug报告。是的,这对于没有Contents/MacOS子目录层次结构的iOS上的浅层bundle也是正确的。
CFURLRef url = (CFURLRef)CFAutorelease((CFURLRef)CFBundleCopyBundleURL(CFBundleGetMainBundle()));
QString path = QUrl::fromCFURL(url).path();