Создавая элемент с целым числом, QStandardItem не предоставляет QSpinBox - PullRequest
1 голос
/ 20 марта 2020

Я использую PySide2 и QTableView с QStandardItemModel (объект с именем resourcesModel) в моей программе. Когда я использую следующий код для создания, заполнения и помещения элемента в таблицу:

item = QStandardItem()
item.setData(123123, Qt.EditRole)
resourcesModel.setItem(1, 1, item)

, когда я дважды щелкаю ячейку, содержащую это значение, появляется поле для редактирования данных, которое я можно положить буквы в. Мое ожидаемое поведение - иметь QSpinBox, чтобы туда могли помещаться только цифры.

Этот код:

item = QStandardItem()
item.setData(0.25, Qt.EditRole)
resourcesModel.setItem(1, 1, item)

представляет QDoubleSpinBox после двойного щелчка по ячейке, как и ожидалось. Оба этих кода в PyQt5 предоставляют спинбоксы, как и ожидалось.

Почему QStandardItem не предоставляет QSpinBox, когда введенное значение является просто целым числом? Можно ли обойти это без написания специального делегата?

Спасибо за все ваши ответы.

1 Ответ

1 голос
/ 20 марта 2020

Объяснение:

В результате PySide2 преобразует целое число из python в LongLong (QVariant :: LongLong = 4) в C ++, который не обрабатывается QItemEditorFactory по умолчанию с помощью по умолчанию используется QLineEdit (в PyQt конвертируется в QMetaType :: Int = 2).

Решение:

Одним из возможных решений является создание пользовательского QItemEditorFactory который возвращает соответствующий виджет:

from PySide2 import QtCore, QtGui, QtWidgets


class ItemEditorFactory(QtWidgets.QItemEditorFactory):
    def createEditor(self, userType, parent):
        if userType == 4:
            return QtWidgets.QSpinBox(parent, minimum=-2147483648, maximum=2147483647)
        return super().createEditor(userType, parent)


if __name__ == "__main__":
    app = QtWidgets.QApplication([])

    <b>factory = ItemEditorFactory()
    QtWidgets.QItemEditorFactory.setDefaultFactory(factory)</b>

    w = QtWidgets.QTableView()

    resourcesModel = QtGui.QStandardItemModel(2, 2)
    w.setModel(resourcesModel)

    item = QtGui.QStandardItem()
    item.setData(123123, QtCore.Qt.EditRole)
    resourcesModel.setItem(1, 1, item)

    w.resize(640, 480)
    w.show()

    app.exec_()
...