从QML网址获取路径

时间:2014-07-24 07:43:57

标签: qt url qml filedialog

FileDialog提供了QML url变量。 theurl.toString()提供类似file:///c:\foo\bar.txt的内容。我如何获得c:\foo\bar.txt

我希望以跨平台的方式实现这一目标,理想情况下不依赖于正则表达式的黑客攻击。 QUrl提供path()方法,但我似乎无法从QML访问它。

3 个答案:

答案 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);
    }
}