我试图通过右键单击项目并从上下文菜单中选择“编辑”来使它的项目可编辑的qtreeview。现在,我只是从树视图中取出该项目并将其设置为可编辑,然后调用item.edit()。
我无法弄清楚它的另一面。我必须弄清楚如何在关闭编辑字段后将该项目设置回不可编辑状态。
理想情况下,我只是捕获一个在编辑框关闭后立即触发的信号,但是我似乎找不到。
有什么想法吗?
编辑:我使用的是QSortFilterProxyModel,后面是QStandardItemModel,里面是QStandardItems。真正的问题是这个。
关闭qstandarditem的编辑框后是否会触发信号?
答案 0 :(得分:0)
如果要检测编辑器何时关闭,则必须使用委托人的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_())