FileDialog
提供了QML url
变量。 theurl.toString()
提供类似file:///c:\foo\bar.txt
的内容。我如何获得c:\foo\bar.txt
?
我希望以跨平台的方式实现这一目标,理想情况下不依赖于正则表达式的黑客攻击。 QUrl
提供path()
方法,但我似乎无法从QML访问它。
答案 0 :(得分:4)
正如评论中已经指出的那样,似乎没有办法(但是?)在没有正则表达式的情况下获得路径本身。所以这是唯一的出路:
FileDialog {
onAccepted: {
var path = myFileDialog.fileUrl.toString();
// remove prefixed "file:///"
path = path.replace(/^(file:\/{3})/,"");
// unescape html codes like '%23' for '#'
cleanPath = decodeURIComponent(path);
console.log(cleanPath)
}
}
这个正则表达式应该非常健壮,因为它只从字符串的开头删除file:///
。
您还需要取消一些HTML字符(如果文件名包含例如哈希#
,则会返回%23
。我们使用JavaScript函数{{1}对此进行解码})。
如果您不仅希望过滤decodeURIComponent()
,还要过滤file:///
和qrc://
,则可以使用此RegEx:
http://
所以新的完整代码将是:
^(file:\/{3})|(qrc:\/{2})|(http:\/{2})
这是RegEx'es的一个很好的游乐场:http://regex101.com/r/zC1nD5/1
答案 1 :(得分:2)
在MS Windows中,“file:/// c:\ foo \ bar.txt”应转换为“c:\ foo \ bar.txt”。但是在Linux中,URL“file:/// Users / data / abcdef”具有正确的路径“/ Users / data / abcdef”。我创建了一个简单的函数来将url转换为path:
function urlToPath(urlString) {
var s
if (urlString.startsWith("file:///")) {
var k = urlString.charAt(9) === ':' ? 8 : 7
s = urlString.substring(k)
} else {
s = urlString
}
return decodeURIComponent(s);
}
答案 2 :(得分:2)
按照上面的Chris Dolan的回答,使用C ++中的插槽处理这个问题可能是最好的:
public slots:
void handleFileChosen(const QString &urlString) {
const QUrl url(urlString);
if (url.isLocalFile()) {
setFile(QDir::toNativeSeparators(url.toLocalFile()));
} else {
setFile(urlString);
}
}