将 QML url (file:///) 转换为本地路径字符串(/ 或 C:\)

问题描述 投票:0回答:1

FormDialog 的

selectedFile
属性在转换为字符串时看起来像 URI:

file:///home/waldo/Downloads

FolderDialog {
    onAccepted: monitorForm.monitorPath = selectedFolder
}
Label {
    text: monitorForm.monitorPath
}

我需要将其显示为本地路径:

/home/waldo/Downloads

另一个问题询问一种使用 QML 来做到这一点的方法。这个问题的答案实现了自己处理平台之间差异的方法(除了最上面的答案,它仅在 Windows 上正确工作并删除了 Linux 上的前导斜杠)。我希望有一种方法可以利用 PySide 自动执行此操作。

qml pyside6
1个回答
0
投票

在 C++ 中,QUrl::toString() 采用 QUrl::UrlFormattingOption —— 其中之一是 QUrl::PreferLocalFile:

如果根据 isLocalFile(),URL 是本地文件并且不包含查询或片段,则返回本地文件路径。

PySide6 也提供 toString(),但由于 bug,toString() 需要 QUrl.ComponentFormattingOption 而不是 QUrl.UrlFormattingOption。 QUrl.ComponentFormattingOption 没有 PreferLocalFile 标志,但我们可以将 QUrl.UrlFormattingOption 转换为 QUrl.ComponentFormattingOption,如下所示:

QUrl.ComponentFormattingOption.PrettyDecoded | QUrl.UrlFormattingOption.PreferLocalFile

完整代码:

GridLayout { // The root element
    id: monitorForm
    signal folderSelected(folder: string)
    property string monitorPath

    Label {
        text: monitorForm.monitorPath
    }
    FolderDialog {
        onAccepted: monitorForm.folderSelected(selectedFolder)
    }
}
import sys
from PySide6.QtCore import QUrl
from PySide6.QtGui import QGuiApplication
from PySide6.QtQml import QQmlApplicationEngine

app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
engine.load('main.qml')

root = engine.rootObjects()[0]

def assign_url_to_monitorPath(x):
    root.setProperty('monitorPath', x.toString(QUrl.ComponentFormattingOption.PrettyDecoded | QUrl.UrlFormattingOption.PreferLocalFile))

root.folderSelected.connect(assign_url_to_monitorPath)

exit(app.exec())
© www.soinside.com 2019 - 2024. All rights reserved.