QItemDelegate::paint вызывает drawBackground для отрисовки фона.
Посмотри реализацию drawBackground ($QTDIR\src\gui\itemviews\qitemdelegate.cpp) и станет все ясно.
Версия 4.2.2.
действительно... посмотрел. понял.
// draw the background color
if (option.showDecorationSelected && (option.state & QStyle::State_Selected)) {
QPalette::ColorGroup cg = option.state & QStyle::State_Enabled
? QPalette::Normal : QPalette::Disabled;
if (cg == QPalette::Normal && !(option.state & QStyle::State_Active))
cg = QPalette::Inactive;
painter->fillRect(option.rect, option.palette.brush(cg, QPalette::Highlight));
} else {
value = index.data(Qt::BackgroundColorRole);
if (value.isValid() && qvariant_cast<QColor>(value).isValid())
painter->fillRect(option.rect, qvariant_cast<QColor>(value));
}
Получается, что если модель возвращает не валидный результат, то
делегат ничего не делает, иначе - красит в указанный цвет.
Пока нашел такой выход (на примере QTableWidget):
При создании итема указываем дефолтный QVariant:
QTableWidgetItem *item=new QTableWidgetItem("bla-bla");
item->setData(Qt::BackgroundColorRole,QVariant());
Далее создаем простенький делегат и переопределяем метод paint:
void MDTDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
if(!index.data(Qt::BackgroundColorRole).isValid())
painter->fillRect(option.rect, QColor(Qt::red));
QItemDelegate::paint(painter,option,index);
}
Ну в общем такая примерно технология...