是否可以选择在 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_()
我使用 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_()