如何使 PyQt5 QTreeview 节点在代码中可编辑?
How do you make a PyQt5 QTreeview node editable in code?
我有一个问题。
我正在使用 PyQt5 和 Python 3.6,我希望使用 QTreeview 列出文件夹中的文件。当用户右键单击文件夹中的文件时,我会有一个上下文菜单。其中一个选项是重命名。如果用户单击它,我希望选择文件,然后突出显示文件名,就像 Windows 在文件资源管理器中执行此操作时所做的那样。
Windows 文件重命名
我很确定我已经想出了如何使用菜单本身和其他功能(删除、打开等)而且我相当确定我将能够使用 slot/signal 捕获新名称并在文件系统中更改它。但是我完全不知道如何以编程方式进行选择和突出显示。同样,这将通过上下文菜单功能完成。我已经花了 HOURS 现在搜索 Internet 和 Qt 文档试图解决这个问题。我承认我在这方面的文档中迷失了方向。
我看到在哪里可以使用 QTreeview 的 currentIndex() 来获取当前所选项目的 QModelIndex 对象,但是通过 QModelIndex 文档挖掘,我没有找到任何关于编辑或突出显示项目的信息。我知道有旗帜。我在模型示例中看到了它们。我不明白你应该用它们做什么。
QTreeview 支持这个功能吗?我也看过 QTreewidget,但它似乎没有我需要的将文件显示为节点文件系统样式的功能。
感谢您的帮助。
您需要做的是:
- 禁用
QFileSystemModel
的只读 属性。
- 禁用 QTreeView 触发器
- 使用
indexAt()
获取与点击位置关联的QModelIndex
- 通过
QTreeView
的 edit()
方法启用编辑。
在示例中,我展示了如何在第一列中启用上下文菜单。
from PyQt5 import QtCore, QtWidgets
class FileSystemView(QtWidgets.QTreeView):
def __init__(self, parent=None):
super(FileSystemView, self).__init__(parent)
self.model = QtWidgets.QFileSystemModel()
self.model.setRootPath(QtCore.QDir.homePath())
self.setModel(self.model)
self.setRootIndex(self.model.index(QtCore.QDir.homePath()))
self.model.setReadOnly(False)
self.setAnimated(False)
self.setSortingEnabled(True)
self.setEditTriggers(QtWidgets.QTreeView.NoEditTriggers)
self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.customContextMenuRequested.connect(self.showContextMenu)
def showContextMenu(self, point):
ix = self.indexAt(point)
if ix.column() == 0:
menu = QtWidgets.QMenu()
menu.addAction("Rename")
action = menu.exec_(self.mapToGlobal(point))
if action:
if action.text() == "Rename":
self.edit(ix)
if __name__ == '__main__':
import sys
app =QtWidgets.QApplication(sys.argv)
w = FileSystemView()
w.show()
sys.exit(app.exec_())
我有一个问题。
我正在使用 PyQt5 和 Python 3.6,我希望使用 QTreeview 列出文件夹中的文件。当用户右键单击文件夹中的文件时,我会有一个上下文菜单。其中一个选项是重命名。如果用户单击它,我希望选择文件,然后突出显示文件名,就像 Windows 在文件资源管理器中执行此操作时所做的那样。
Windows 文件重命名
我很确定我已经想出了如何使用菜单本身和其他功能(删除、打开等)而且我相当确定我将能够使用 slot/signal 捕获新名称并在文件系统中更改它。但是我完全不知道如何以编程方式进行选择和突出显示。同样,这将通过上下文菜单功能完成。我已经花了 HOURS 现在搜索 Internet 和 Qt 文档试图解决这个问题。我承认我在这方面的文档中迷失了方向。
我看到在哪里可以使用 QTreeview 的 currentIndex() 来获取当前所选项目的 QModelIndex 对象,但是通过 QModelIndex 文档挖掘,我没有找到任何关于编辑或突出显示项目的信息。我知道有旗帜。我在模型示例中看到了它们。我不明白你应该用它们做什么。
QTreeview 支持这个功能吗?我也看过 QTreewidget,但它似乎没有我需要的将文件显示为节点文件系统样式的功能。
感谢您的帮助。
您需要做的是:
- 禁用
QFileSystemModel
的只读 属性。 - 禁用 QTreeView 触发器
- 使用
indexAt()
获取与点击位置关联的QModelIndex
- 通过
QTreeView
的edit()
方法启用编辑。
在示例中,我展示了如何在第一列中启用上下文菜单。
from PyQt5 import QtCore, QtWidgets
class FileSystemView(QtWidgets.QTreeView):
def __init__(self, parent=None):
super(FileSystemView, self).__init__(parent)
self.model = QtWidgets.QFileSystemModel()
self.model.setRootPath(QtCore.QDir.homePath())
self.setModel(self.model)
self.setRootIndex(self.model.index(QtCore.QDir.homePath()))
self.model.setReadOnly(False)
self.setAnimated(False)
self.setSortingEnabled(True)
self.setEditTriggers(QtWidgets.QTreeView.NoEditTriggers)
self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.customContextMenuRequested.connect(self.showContextMenu)
def showContextMenu(self, point):
ix = self.indexAt(point)
if ix.column() == 0:
menu = QtWidgets.QMenu()
menu.addAction("Rename")
action = menu.exec_(self.mapToGlobal(point))
if action:
if action.text() == "Rename":
self.edit(ix)
if __name__ == '__main__':
import sys
app =QtWidgets.QApplication(sys.argv)
w = FileSystemView()
w.show()
sys.exit(app.exec_())