2010-08-15 41 views
3

Qt文檔「Mac Differences」頁面提供了以下代碼,用於訪問應用程序的捆綁路徑:的Qt - 訪問束路徑

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; 

回答

0

現代的方式使用Qt 5和OS X 10.9或更高版本是:

CFURLRef url = (CFURLRef)CFAutorelease((CFURLRef)CFBundleCopyBundleURL(CFBundleGetMainBundle())); 
QString path = QUrl::fromCFURL(url).path(); 
+0

是的,這對於沒有Contents/MacOS子目錄層次結構的iOS上的淺綁定也是正確的。 – 2016-07-24 20:42:20

3

從不使用第一個代碼。正如在Qt文檔中所寫,它可能無法在非英文環境中工作,因爲文件名編碼不是CFStringGetSystemEncoding(),它返回用戶的主要非Unicode編碼。取而代之的是,文件名總是被utf-8編碼(有輕微的變形。)

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

更準確地說,你需要使用CFStringGetFileSystemRepresentation

QCoreApplication::applicationDirPath()(主要)正確地考慮了這些微妙之處,因此如果您希望您的應用程序在非英語版Mac上工作,則應該使用後一種方法。

+0

有趣的...我不知道爲什麼諾基亞把該文檔中,儘管它的問題?我相信我已經看到了在文檔其他地方(或者在其中一個例子中)編寫的第二種方式。 – 2010-08-15 22:38:48

+0

我猜這篇文檔是很久以前寫的很舊的。代碼本身使用(大部分)正確的方法,並且維護良好。你應該提交一個錯誤報告。 – Yuji 2010-08-15 22:51:36