23

I get the file path from Qml like this:

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

The above file path looks like this: file:///C:/uuuu.a3

But when this path is passed to QFile, it complains

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

How to solve this problem?

László Papp
  • 51,870
  • 39
  • 111
  • 135
Dean Chen
  • 3,800
  • 8
  • 45
  • 70

4 Answers4

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

This is probably what you need. It will return "C:/uuuu.a3" in your case.

claudiub
  • 504
  • 1
  • 3
  • 6
17

QString was not meant for a canonical url representation. It is a string class existing mostly due to the utf use cases.

What you are looking for is QUrl which was meant for use cases like this. Pass your path to that, and then get the "QFile-readable" path out of that, then pass it to QFile.

You will need to use the following method for the conversion before passing the path to QFile:

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

Returns a QUrl representation of localFile, interpreted as a local file. This function accepts paths separated by slashes as well as the native separator for this platform.

This function also accepts paths with a doubled leading slash (or backslash) to indicate a remote file, as in "//servername/path/to/file.txt". Note that only certain platforms can actually open this file using QFile::open().

Community
  • 1
  • 1
László Papp
  • 51,870
  • 39
  • 111
  • 135
  • 9
    For me, `QUrl( "file:///C:/myfile.txt" ).toLocalFile();` does the conversion to `"C:/myfile.txt"` while fromLocalFile just seems to prepend `"file:///"`. Also see [this answer below](http://stackoverflow.com/a/21837009/1619432). – handle Aug 17 '16 at 15:19
5

How annoying that QML doesn't have this stuff. I have created a helper function which can be called from the QML:

Q_INVOKABLE QString convertUrlToNativeFilePath(const QUrl& urlStylePath) const;

Which simply does this:

QString OurClassName::convertUrlToNativeFilePath(const QUrl& urlStylePath) const
{
    return QDir::toNativeSeparators(urlStylePath.toLocalFile());
}
gremwell
  • 1,419
  • 17
  • 23
-1

Have a look at QDir::toNativeSeparators(QString)

Md.
  • 496
  • 4
  • 11