通过上下文菜单将qtreeview项设置为可编辑,并自动将其设置回禁用状态?

时间:2019-09-19 19:54:25

标签: python pyqt pyqt5

我试图通过右键单击项目并从上下文菜单中选择“编辑”来使它的项目可编辑的qtreeview。现在,我只是从树视图中取出该项目并将其设置为可编辑,然后调用item.edit()。

我无法弄清楚它的另一面。我必须弄清楚如何在关闭编辑字段后将该项目设置回不可编辑状态。

理想情况下,我只是捕获一个在编辑框关闭后立即触发的信号,但是我似乎找不到。

有什么想法吗?

编辑:我使用的是QSortFilterProxyModel,后面是QStandardItemModel,里面是QStandardItems。真正的问题是这个。

关闭qstandarditem的编辑框后是否会触发信号?

1 个答案:

答案 0 :(得分:0)

如果要检测编辑器何时关闭,则必须使用委托人的closeEditor()信号。

考虑到,如果您的模型是QStandardItemModel,则可以使用Qt::ItemIsEditablesetEditable()方法启用QStandardItem

from PyQt5 import QtCore, QtGui, QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.treeview = QtWidgets.QTreeView()
        self.treeview.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.treeview.customContextMenuRequested.connect(
            self.on_customContextMenuRequested
        )
        self.treeview.itemDelegate().closeEditor.connect(self._on_closeEditor)
        self.setCentralWidget(self.treeview)

        self.model = QtGui.QStandardItemModel(self)
        self.treeview.setModel(self.model)

        for i in range(4):
            it = QtGui.QStandardItem(f"{i}")
            it.setEditable(False)
            self.model.appendRow(it)
            for j in range(5):
                child_it = QtGui.QStandardItem(f"{i}-{j}")
                child_it.setEditable(False)
                it.appendRow(child_it)

        self.treeview.expandAll()

    @QtCore.pyqtSlot("QWidget*")
    def _on_closeEditor(self, editor):
        p = editor.pos()
        index = self.treeview.indexAt(p)
        if not index.isValid():
            return
        it = self.model.itemFromIndex(index)
        it.setEditable(False)

    @QtCore.pyqtSlot(QtCore.QPoint)
    def on_customContextMenuRequested(self, pos):
        index = self.treeview.indexAt(pos)
        if not index.isValid():
            return
        menu = QtWidgets.QMenu()
        edit_action = menu.addAction("&Edit")
        action = menu.exec_(self.treeview.viewport().mapToGlobal(pos))
        if action == edit_action:
            it = self.model.itemFromIndex(index)
            it.setEditable(True)
            self.treeview.edit(index)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    w = MainWindow()
    w.show()

    sys.exit(app.exec_())