如何使 PyQt5 QTreeview 节点在代码中可编辑?

2 python pyqt qtreeview pyqt5

我有个问题。

我正在使用 PyQt5 和 Python 3.6,并且我希望使用 QTreeview 列出文件夹中的文件。当用户右键单击文件夹中的文件时,我将看到一个上下文菜单。选项之一是重命名。如果用户单击该按钮,我希望选择该文件,然后突出显示该文件的名称,就像 Windows 在文件资源管理器中执行此操作时所做的那样。

Windows 文件重命名

我很确定我已经弄清楚了如何处理菜单本身和其他功能(删除、打开等)并且我相当确定我将能够使用插槽/信号来捕获新名称并在文件系统中更改它。但我完全不知道如何以编程方式进行此选择和突出显示。同样,这将通过上下文菜单功能来完成。我现在花了几个小时搜索互联网和 Qt 文档试图解决这个问题。我承认我已经迷失在这个文档中了。

我已经看到可以在哪里使用 QTreeview 的 currentIndex() 来获取当前所选项目的 QModelIndex 对象,但是深入 QModelIndex 文档,我没有找到任何有关编辑或突出显示项目的信息。我知道有旗帜。我在模型示例中看到了它们。我不明白你应该用它们做什么。

QTreeview支持这个功能吗?我也看过 QTreewidget,但它似乎不具有我需要的将文件显示为节点文件系统样式的功能。

谢谢你的帮助。

eyl*_*esc 6

您需要做的事情如下:

  • 禁用 的 ReadOnly 属性QFileSystemModel
  • 禁用 QTreeView 触发器
  • 使用以下命令获取与点击位置关联的 QModelIndexindexAt()
  • edit()通过的方法启用编辑QTreeView

在示例中,我展示了如何启用第一列中的上下文菜单。

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_())
Run Code Online (Sandbox Code Playgroud)