Установить пункт qtreeview для редактирования контекстным меню и автоматически вернуть его в отключенное состояние? - PullRequest
1 голос
/ 19 сентября 2019

Я пытаюсь сделать qtreeview, где его элементы доступны для редактирования, щелкнув по ним правой кнопкой мыши и выбрав в контекстном меню пункт edit.Прямо сейчас я просто извлекаю элемент из древовидного списка и устанавливаю его в редактируемый, затем вызываю item.edit ().

Хотя я не могу понять другую сторону этого.Я должен выяснить, как установить этот элемент обратно недоступным для редактирования после закрытия поля редактирования.

В идеале я бы просто захватил сигнал, который срабатывает сразу после закрытия поля редактирования, но я не могу найтиодин.

Любые идеи?

Редактировать: я использую QSortFilterProxyModel с QStandardItemModel позади него и QStandardItems внутри.Реальный вопрос заключается в следующем.

Есть ли сигнал, который срабатывает после закрытия поля редактирования для qstandarditem?

1 Ответ

0 голосов
/ 19 сентября 2019

Если вы хотите определить, когда редактор закрывается, вы должны использовать делегатский сигнал closeEditor().

Учитывая, что ваша модель имеет значение QStandardItemModel затем вы можете включить Qt::ItemIsEditable, используя setEditable() метод 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_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...