我有个问题。

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

Windows文件重命名



我敢肯定,我已经弄清楚了我想如何使用菜单本身以及其他功能(Delete,Open等),而且我相当确定我将能够使用插槽/信号来捕获菜单。新名称并在文件系统中更改它。但是我完全迷住了如何进行选择并以编程方式突出显示。同样,这将通过上下文菜单功能完成。我现在花了HOURS来搜索Internet和Qt文档,以弄清这一点。我承认我对此文档已经迷失了。

我已经看到了可以在哪里使用QTreeview的currentIndex()来获取当前所选项目的QModelIndex对象,但是在浏览QModelIndex文档时,我没有发现有关编辑或突出显示项目的任何信息。我知道有旗帜。我在模型示例中看到了它们。我看不到您应该如何处理他们。

QTreeview是否支持此功能?我也看过QTreewidget,但是它似乎没有我需要将文件显示为节点文件系统样式的功能。

谢谢你的帮助。

最佳答案

您需要执行以下操作:


禁用QFileSystemModel的ReadOnly属性。
禁用QTreeView触发器
使用indexAt()获取与点击位置相关的QModelIndex
通过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_())

关于python - 如何使PyQt5 QTreeview节点在代码中可编辑?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51343109/

10-15 22:50