Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt-访问包路径_C++_Macos_Qt - Fatal编程技术网

C++ Qt-访问包路径

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

Qt documentation“”页面提供了访问应用程序包路径的以下代码:

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();