Проблема с форматированием значений в qsqltablemodel

Создание подкласса QSQLTableModel и переопределение метода данных:

class SclDataModel(QSqlTableModel):
    def __init__(self, parent=None):
        super(SclDataModel, self).__init__(parent)

    def data(self, index, role=None):
        if role == Qt.DisplayRole:
            if index.column() == 2 or index.column() == 3:
                val = QSqlTableModel.data(self, index, Qt.DisplayRole) #<--Is set to None on cell edit.
                print('Value={}'.format(val))   
                return '${:,.2f}'.format(val)
            else:
                return super(SclDataModel,self).data(index,role)
        elif role == Qt.TextAlignmentRole:
            return Qt.AlignVCenter | Qt.AlignRight
        else:
            return QVariant()

Значения отображаются правильно, когда таблица загружена; однако, когда я редактирую один из элементов, я получаю сообщение об ошибке форматирования значения, которое передается как NoneType. Как ни странно, когда я вставляю новую строку и редактирую значение, она форматируется правильно.

enter image description here

Если я редактирую это значение, я получаю следующую ошибку:

Value=None
Traceback (most recent call last):
  File "/mnt/DevServer/Python/PPSBooks/SvcData/scldata_browse.py", line 39, in data
    return '${:,.2f}'.format(val)
TypeError: unsupported format string passed to NoneType.__format__

Я пытаюсь отформатировать значения (для отображения) как деньги США

Elcid_91 31.10.2018 13:42

Вы можете показать картинку того, на что указываете

eyllanesc 31.10.2018 13:43

Вы хотите, чтобы при редактировании появлялся символ «$»?

eyllanesc 31.10.2018 14:01

Нет, только когда он отображается в таблице.

Elcid_91 31.10.2018 14:03

хорошо, последний вопрос: какой тип поля - это столбцы в базе данных, которые вы хотите изменить?

eyllanesc 31.10.2018 14:05

Использование MySql и поля DECIMAL (10,4)

Elcid_91 31.10.2018 14:07

Как я указываю в своем решении, задача не модели, а делегата :-)

eyllanesc 31.10.2018 14:10
1
7
197
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В общем случае не рекомендуется изменять модель, поскольку она представляет данные, а в вашем случае символ $ является только визуальным, поэтому визуальная задача принадлежит делегату:

class MoneyDelegate(QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super(MoneyDelegate, self).initStyleOption(option, index)
        option.text = '${:,.2f}'.format(index.data())
        option.displayAlignment = Qt.AlignVCenter | Qt.AlignRight

...

view = QTableView()
delegate = MoneyDelegate(view)
for i in (2, 3):
    view.setItemDelegateForColumn(i, delegate)

С другой стороны, если вы собираетесь изменять данные, роль по умолчанию - Qt::DisplayRole:

class SclDataModel(QSqlTableModel):
    def data(self, index, role=Qt.DisplayRole):
        ...

Обновлять: Если вы хотите изменить редактор, вы должны перезаписать метод createEditor() делегата:

class MoneyDelegate(QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super(MoneyDelegate, self).initStyleOption(option, index)
        option.text = '${:,.2f}'.format(index.data())
        option.displayAlignment = Qt.AlignVCenter | Qt.AlignRight

    def createEditor(self, parent, option, index):
        editor = super(MoneyDelegate, self).createEditor(parent, option, index)
        if any(isinstance(editor, t) for t in (QDoubleSpinBox, QSpinBox)):
            editor.setMinimum(0)
            editor.setMaximum(2**15)
        return editor

Это прекрасно работает. Спасибо. Могу ли я использовать того же делегата для настройки счетчиков для редактирования?

Elcid_91 31.10.2018 14:28

@ Elcid_91 делегаты состоят из 2 частей: то, что используется для режима без редактирования, которое мы использовали сейчас, и другого для редакции, которую вы можете использовать для редактора, в зависимости от того, что вы хотите, вы можете указать соответствующий метод. Что вы хотите изменить в QDoubleSpinbox?

eyllanesc 31.10.2018 14:30

Я хочу установить минимум и максимум.

Elcid_91 31.10.2018 14:33

Еще раз спасибо за ответы на все мои вопросы. Вы все еще изучаете модель Qt5, и у вас есть чрезвычайно ценный ресурс.

Elcid_91 31.10.2018 14:42

Другие вопросы по теме