是否可以选择在 QFileDialog 的 SideBar 中重命名 QUrl/shortcut?

Is there an option to rename a QUrl/shortcut in a SideBar of a QFileDialog?

我使用 QFileDialog 的边栏,它从几个文件夹字符串中获取 QUrls。

我使用的是 fromLocalFile(dir) 方法,效果很好。 我的问题是,这两个路径的最后一个文件夹名称相同。 例如:

place1 = "C:\publicDirectories\software\temp"
place2 = "D:\personalUserDirectories\software\temp"

dialog = QtWidgets.QFileDialog(self, 'search', directory, filter)
dialog.setFileMode(QtWidgets.QFileDialog.DirectoryOnly)
dialog.setSidebarUrls([QtCore.QUrl.fromLocalFile(place1), QtCore.QUrl.fromLocalFile(place2)])

Qt 采用 QUrl 的最后一个文件夹名称并以此命名快捷方式。因此,当对话框打开时,我有两个名为“temp”的条目。 是否有机会深入研究 SideBar 的 Qt 代码以重命名快捷方式,尽管它们仍然指向如上所示的相同文件夹? 我的意思是像你正在做的事情来重命名 QMessageBox 的 Yes/No 按钮...

我在 qt 文档中找不到任何关于它的信息。

一个可能的解决方案是设置一个委托来更改边栏中显示的文本:

from PyQt5 import QtCore, QtWidgets

UrlRole = QtCore.Qt.UserRole + 1
EnabledRole = QtCore.Qt.UserRole + 2


class StyledItemDelegate(QtWidgets.QStyledItemDelegate):
    mapping = dict()

    def initStyleOption(self, option, index):
        super().initStyleOption(option, index)
        url = index.data(UrlRole)
        text = self.mapping.get(url)
        if isinstance(text, str):
            option.text = text
        is_enabled = index.data(EnabledRole)
        if is_enabled is not None and not is_enabled:
            option.state &= ~QtWidgets.QStyle.State_Enabled

app = QtWidgets.QApplication([])

places = {
    QtCore.QUrl.fromLocalFile("/home/eyllanesc"): "Foo",
    QtCore.QUrl.fromLocalFile("/home/eyllanesc/Pictures"): "Bar",
}

dialog = QtWidgets.QFileDialog(
    caption="search",
    options=QtWidgets.QFileDialog.DontUseNativeDialog,
    fileMode=QtWidgets.QFileDialog.DirectoryOnly,
)
dialog.setSidebarUrls(places.keys())
sidebar = dialog.findChild(QtWidgets.QListView, "sidebar")
delegate = StyledItemDelegate(sidebar)
delegate.mapping = places
sidebar.setItemDelegate(delegate)
dialog.exec_()