2014-01-07 8 views
13

ich den Dateipfad von QML wie diese:QFile erkennt nicht file: /// URL-Pfad-Format

mainView.projectFilePath = Qt.resolvedUrl(newProjectFileDlg.fileUrl).toString(); 

Die obige Dateipfad sieht wie folgt aus: file: /// C:/uuuu .a3

Aber wenn dieser Weg zu QFile übergeben wird, klagt sie

The filename, directory name, or volume label syntax is incorrect 

Wie dieses Problem zu lösen?

Antwort

12

QString war nicht für eine kanonische URL-Repräsentation gedacht. Es ist eine String-Klasse, die hauptsächlich aufgrund der utf-Anwendungsfälle existiert.

Was Sie suchen, ist QUrl, die für solche Anwendungsfälle gedacht war. Übergeben Sie den Pfad dorthin und rufen Sie dann den Pfad "QFile-lesbar" ab und geben Sie ihn an QFile weiter.

Sie müssen das folgende Verfahren für die Konvertierung verwenden, bevor Sie den Pfad zu QFile vorbei:

QUrl QUrl::fromLocalFile(const QString & localFile) [static]

Gibt eine QUrl Darstellung localfile, als lokale Datei interpretiert. Diese Funktion akzeptiert Pfade, die durch Schrägstriche getrennt sind, sowie das systemeigene Trennzeichen für diese Plattform.

Diese Funktion akzeptiert auch Pfade mit einem doppelten führenden Schrägstrich (oder umgekehrten Schrägstrich), um eine entfernte Datei anzugeben, wie in "//servername/path/to/file.txt". Beachten Sie, dass nur bestimmte Plattformen diese Datei mit QFile :: open() öffnen können.

+4

Für mich 'QUrl („file: /// C: /myfile.txt ") .toLocalFile();' führt die Konvertierung zu '" C: /myfile.txt "' durch, während vonLocalFile scheinbar '' file: /// "' vorangeht. Siehe auch [diese Antwort unten] (http://stackoverflow.com/a/21837009/1619432). – handle

19
QUrl url(newProjectFileDlg.fileUrl); 
url.toLocalFile(); 

Dies ist wahrscheinlich das, was Sie brauchen. In Ihrem Fall wird "C: /uuuu.a3" zurückgegeben.

+1

Dies ist die richtige Antwort auf die Frage, nicht die akzeptierte. –

-1

Werfen Sie einen Blick auf QDir::toNativeSeparators(QString)

4

Wie ärgerlich, dass QML nicht das Zeug hat. Ich habe eine Hilfsfunktion erstellt, die von der QML aufgerufen werden kann:

Q_INVOKABLE QString convertUrlToNativeFilePath(const QUrl& urlStylePath) const; 

die einfach tut dies:

QString OurClassName::convertUrlToNativeFilePath(const QUrl& urlStylePath) const 
{ 
    return QDir::toNativeSeparators(urlStylePath.toLocalFile()); 
} 
+0

Danke, das war hilfreich – arynaq