QComboBox делегат

Делегат может иметь режим простого отображения и режим редактирования .

Режим отображения это просто переопределенный метод paint.

Для режима редактирования каждый раз создается выпадающий список при входе в режим редактирования.

Методы data и flags для колонки делегата уже не вызываются стандартно.

фотка 1

Делегат предназначен для подмены числовых значений более информативными визуальными представлениями на основе QWidget в режиме просто отображения.

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

paint

Отрисовка каждой ячейки происходит через метод paint, который использует разные draw вариации для разных типов контролов.

Но вот кто вызывает методы paint для ячеек - это события , которые приходят от ОС, нажатия мышки, перемещения мышки т.д.

Для режима визуального отображения при просмотре строки таблицы делегат может переопределить метод отрисовки paint просто на свой вариант.

В противном случае отображение будет происходить стандартно через запросы функций модели таблицы: data, flags и т.д.

Реализуется виджет , у которого красиво представлены для выбора его значения. Происходит это в момент входа в режим редактирования поля таблицы.

Что может сразу не понравиться в делегате с переопределенным методом отрисовки paint (к примеру в Qt 4.8.1) это то что фон виджета не прозрачен и выделяется на общем представлении таблицы например в режиме выделения строки.

При выделении строки в целом поле делегата не выделяется:

фотка 2

На самом деле это вопрос можно легко решить в том же paint , если посмотреть , что передается в параметре option . Здесь приходят вызовы paint и для выделения ячейки .


        if (option.state & QStyle::State_Selected)
        {
            painter->setPen(QPen(option.palette.color(QPalette::HighlightedText))); // Цвет пера
            painter->fillRect(option.rect, option.palette.highlight());
        }