Делегаты

Оказывается 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

Где и когда вызывается делегат освещено на странице QTableView новые возможности. Именно здесь было установлено, что вызов делегата происходит при событии двойной клик, а далее работает модель выделения ячейки, то есть смотрим метод select.

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

фотка 1

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

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

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

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

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

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

фотка 2

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

Очень трудная и интересная тема как создать свой личный QTableView, в котором пришлось разобраться подробно как  работает весь  функционал таблицы на низком уровне, смотрите QTableView новые возможности.