Делегаты

Оказывается QTableView класс создает по умолчанию так называемые делагаты (для визуального отображения/редактирования) ячеек таблицы на основании их типа данных.

The standard factory implementation provides editors for a variety of data types. These are created whenever a delegate needs to provide an editor for data supplied by a model. The following table shows the relationship between types and the standard editors provided.

\header \o Type \o Editor Widget
\row    \o bool \o QComboBox
\row    \o double \o QDoubleSpinBox
\row    \o int \o{1,2} QSpinBox
\row    \o unsigned int
\row    \o QDate \o QDateEdit
\row    \o QDateTime \o QDateTimeEdit
\row    \o QPixmap \o QLabel
\row    \o QString \o QLineEdit
\row    \o QTime \o QTimeEdit

Бывает, что делегат по умолчанию работает не так как нам хотелось бы. Например QDoubleSpinBox почему-то не дает ввести 3 знака после запятой (только 2) для типа данных соответственно Double.

фотка 1

Причем обратите внимание отображаются числа с тремя знаками нормально. Но отображение настраивается в модели данных в функции data. Но суть не в этом.

Как изменить поведение делегата и получить возможность ввести число с тремя значками после запятой.

У QTableView если поискать предусмотрена функция setItemDelegateForColumn, которая устанавливает делегат для всех ячеек колонки. В качестве параметра надо передать указатель на делегат  (QAbstractItemDelegate *). 

Делегат это просто класс, унаследованный от QAbstractItemDelegate (или еще лучше от его наследника QStyledItemDelegate), в котором нам надо переопределить только функцию createEditor

createEditor - это просто функция, которая при вызове создает какой-то виджет (у нас стандартный QDoubleSpinBox) и прорисовывает его в поле таблицы.

Ньанс заключается только в том, что для QDoubleSpinBox мы установим setDecimals(3) и теперь нам будет позволено ввести 3 цифры после запятой:

фотка 2

Есть открытый проект, в котором реализовано развитие  управления таблицами базы данных: скачать sql форк.