На этом шаге мы закончим изучение этого вопроса.
Для назначения делегатов представлению следует применять следующие методы, унаследованные от класса QAbstractItemView:
Если в какой-либо ячейке представления действуют одновременно два делегата, заданные для столбца и для строки, будет использоваться делегат, заданный для строки.
В качестве примера рассмотрим небольшое складское приложение, позволяющее править количество каких-либо имеющихся на складе позиций с применением поля ввода целочисленных значений (класс QSpinBox).
from PyQt5 import QtCore, QtWidgets, QtGui import sys # Создаем класс делегата class pinBoxDelegate(QtWidgets.QStyledItemDelegate): def createEditor(self, parent, options, index): # Создаем компонент-редактор, используемый для правки значений # количества позиций editor = QtWidgets.QSpinBox(parent) editor.setFrame(False) editor.setMinimum(0) editor.setSingleStep(1) return editor def setEditorData(self, editor, index): # Заносим в компонент-редактор значение количества value = int(index.model().data(index, QtCore.Qt.EditRole)) editor.setValue(value) def updateEditorGeometry(self, editor, options, index): # Указьзаем размеры компонента-редактора editor.setGeometry(options.rect) def setModelData(self, editor, model, index): # Заносим исправленное значение количества в модель value = str(editor.value()) model.setData(index, value, QtCore.Qt.EditRole) app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QTableView() window.setWindowTitle("Использование делегата") sti = QtGui.QStandardItemModel(parent=window) lst1 = ['Дискета', 'Бумага для принтера', 'Барабан для принтера'] lst2 = ["10", "3", "8"] for row in range(0, 3): item1 = QtGui.QStandardItem(lst1[row]) item2 = QtGui.QStandardItem(lst2[row]) sti.appendRow([item1, item2]) sti.setHorizontalHeaderLabels(['Товар', 'Кол-во']) window.setModel(sti) # Назначаем делегат второму столбцу таблицы window.setItemDelegateForColumn(1, SpinBoxDelegate()) window.setColumnWidth(0, 150) window.resize(300, 150) window.show() sys.exit(app.exec_())
Рис.1. Результат работы приложения
Со следующего шага мы начнем рассматривать работу с базами данных.