Шаг 157.
Библиотека PyQt5.
Списки и таблицы. Использование делегатов (окончание)

    На этом шаге мы закончим изучение этого вопроса.

    Для назначения делегатов представлению следует применять следующие методы, унаследованные от класса 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. Результат работы приложения

    Со следующего шага мы начнем рассматривать работу с базами данных.




Предыдущий шаг Содержание Следующий шаг