2010-08-15 3 views
3

La documentation Qt page « Mac Differences » fournit le code suivant pour accéder à la trajectoire du faisceau d'une application:Qt - l'accès au chemin du faisceau

CFURLRef appUrlRef = CFBundleCopyBundleURL(CFBundleGetMainBundle()); 
CFStringRef macPath = CFURLCopyFileSystemPath(appUrlRef, kCFURLPOSIXPathStyle); 
const char *pathPtr = CFStringGetCStringPtr(macPath,CFStringGetSystemEncoding()); 
qDebug("Path = %s", pathPtr); 
CFRelease(appUrlRef); 
CFRelease(macPath); 

Cependant, quel est l'avantage de ce sur quelque chose de simple, comme ce qui suit:

QDir dir = QDir(QCoreApplication::applicationDirPath()); 
dir.cdUp(); 
dir.cdUp(); 
return dir; 

Répondre

0

La façon moderne avec Qt 5 et OS X 10.9 ou plus est:

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

Oui, et cela sera également correct pour les bundles peu profonds sur iOS qui n'ont pas de hiérarchie de sous-répertoire Contents/MacOS. –

3

Ne jamais utiliser le premier code. Comme indiqué dans la documentation Qt, il peut ne pas fonctionner dans un environnement autre que l'anglais, car le codage du nom de fichier n'est pas CFStringGetSystemEncoding(), ce qui renvoie le codage principal non-unicode de l'utilisateur. Au lieu de cela, le nom de fichier est codé par UTF8 (avec une légère variante.)

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

Plus précisément, vous devez utiliser CFStringGetFileSystemRepresentation. (La plupart du temps) prend correctement en compte ces subtilités, donc vous devriez utiliser la dernière approche, si vous voulez que votre application fonctionne sur des Mac non-anglais.

+0

Intéressant ... Je me demande pourquoi Nokia met que dans la documentation en dépit de ses problèmes? Je crois avoir vu la seconde manière écrite ailleurs dans la documentation (ou peut-être dans l'un des exemples). –

+0

Je suppose que cette documentation est très ancienne et écrite il y a longtemps. Le code lui-même utilise l'approche (la plupart du temps) correcte et est bien maintenu. Vous devriez déposer un rapport de bogue. – Yuji

Questions connexes