我可以这样从 Qml 中获取文件路径:
mainView.projectFilePath = Qt.resolvedUrl(newProjectFileDlg.fileUrl).toString();
上述文件路径看起来像这样: file:///C:/uuuu.a3
但是当这个路径被传递给QFile时,它会报错。
The filename, directory name, or volume label syntax is incorrect
如何解决这个问题?
QUrl url(newProjectFileDlg.fileUrl);
url.toLocalFile();
这可能是你所需要的。它将在你的情况下返回"C:/uuuu.a3"。
QString并不适用于规范的url表示。它是一个字符串类,主要存在于utf用例中。
你需要使用的是QUrl,它是为像这样的用例而设计的。将你的路径传递给它,然后从中获取“QFile可读取”的路径,然后将其传递给QFile。
在将路径传递给QFile之前,您需要使用以下方法进行转换:
静态的 QUrl QUrl::fromLocalFile(const QString & localFile)
返回localFile的QUrl表示形式,解释为本地文件。该函数接受用斜杠分隔的路径以及此平台的本机分隔符。
此函数还接受具有两个前导斜杠(或反斜杠)的路径,以指示远程文件,例如“//servername/path/to/file.txt”。请注意,只有某些平台实际上可以使用QFile::open()打开此文件。
QUrl( "file:///C:/myfile.txt" ).toLocalFile();
可以将其转换为 "C:/myfile.txt"
,而 fromLocalFile
看起来只是在前面添加了 "file:///"
。另请参见下面的回答。 - handle很令人不爽的是QML没有这些东西。我已经创建了一个帮助函数,它可以从QML中调用:
Q_INVOKABLE QString convertUrlToNativeFilePath(const QUrl& urlStylePath) const;
QString OurClassName::convertUrlToNativeFilePath(const QUrl& urlStylePath) const
{
return QDir::toNativeSeparators(urlStylePath.toLocalFile());
}
看一下QDir::toNativeSeparators(QString)