Чтобы настроить редактор для QTreeView
ячейки вам нужно создать QItemDelegate
и связать его с колонкой вашего TreeView.
Пользовательские делегаты могут быть более сложными (например, для изменения сохранения/восстановления поведения редактора), но в этом случае мы просто хотим, чтобы изменить какой класс он использует для создания экземпляра виджета-редактора:
class CustomDelegate(QItemDelegate):
def createEditor(self, parent, option, index):
editor = CustomLineEdit(parent)
return editor
Это обеспечит, что редактор теперь будет виджет CustomLineEdit
, который может иметь любую добавленную функциональность (например, пользовательское контекстное меню). В моем примере ниже я использую слегка измененную версию ответа, предоставленного Achayan, для реализации этого CustomLineEdit
.
можно присвоить пользовательский делегат в колонку со следующим кодом (в данном случае я выбрал столбец 0 из TreeView):
# Create custom Delegate which instantiates our custom editor
delegate = CustomDelegate()
# Set this delegate for the first column only
treeview.setItemDelegateForColumn(0, delegate)
Полный код
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class CustomLineEdit(QLineEdit):
def __init__(self, *args, **kwargs):
super(CustomLineEdit, self).__init__(*args, **kwargs)
self.setContextMenuPolicy(Qt.CustomContextMenu)
self.customContextMenuRequested.connect(self.__contextMenu)
def __contextMenu(self):
self._normalMenu = self.createStandardContextMenu()
self._addCustomMenuItems(self._normalMenu)
self._normalMenu.exec_(QCursor.pos())
def _addCustomMenuItems(self, menu):
menu.addSeparator()
menu.addAction(u'Test', self.testFunc)
def testFunc(self):
print "Call"
class CustomDelegate(QItemDelegate):
def createEditor(self, parent, option, index):
editor = CustomLineEdit(parent)
return editor
if __name__ == "__main__":
app = QApplication(sys.argv)
# Create Widgets
window = QMainWindow()
widget = QWidget()
layout = QVBoxLayout(widget)
treeview = QTreeView()
layout.addWidget(treeview)
window.setCentralWidget(widget)
window.show()
# Create Model
model = QStandardItemModel()
model.setHorizontalHeaderLabels(['Header 1','Header 2'])
treeview.setModel(model)
# Create custom Delegate which instantiates our custom editor
delegate = CustomDelegate()
# Set this delegate for the first column only
treeview.setItemDelegateForColumn(0, delegate)
# Populate the model with some test data
row1 = []
row1.append(QStandardItem("asd"))
row1.append(QStandardItem("fgh"))
model.appendRow(row1)
row2 = []
row2.append(QStandardItem("qwe"))
row2.append(QStandardItem("rty"))
model.appendRow(row2)
app.exec_()
Большое спасибо за ваш точный и поучительный ответ @three_pineapples! Это именно то, что я искал. Ты мне очень помог сегодня :) Я только что адаптировал ваш код, и это отлично работает. – Glyphosate
@ Glyphosate, если это ответит на ваш вопрос, нажмите на галочку в левой части, чтобы отметить это как принятый ответ. Как только у вас будет достаточная репутация, вы также сможете проголосовать за любые ответы, которые, по вашему мнению, будут полезны. –
Все готово. Большое спасибо. – Glyphosate