Несмотря на то, что эту тему задавали 6 месяцев назад, я наткнулся на это только сейчас.
Ответ Сергея Кулиша очень помог, и я хотел бы предложить два улучшения (Снова перезапись QHeaderClass , но в качестве альтернативы использование перезаписанного QStyle ):
void AlternatingHeaderClass::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const {
QAbstractItemView* abstractView(qobject_cast<QAbstractItemView*>(parent()));
if (abstractView && abstractView->alternatingRowColors()) {
QHeaderView::paintSection(painter, rect, logicalIndex);
if (visualIndex(logicalIndex) % 2) {
painter->fillRect(rect, QColor(0, 0, 0, 30));
}
} else {
QHeaderView::paintSection(painter, rect, logicalIndex);
}
}
Преимущество состоит в том, что он уважает настройки чередующихся строк своего родителя и использует visualIndex, чтобы он правильно отображался на экране.Недостаток в том, что текст тоже немного затухает.Кроме того, после этого выбор строки может завершиться неудачей или должен быть добавлен.
Более правильно, эффект может быть достигнут путем определения QStyle (как также уже предложено) со следующим методом в нем.
void AlternatingHeaderStyle::drawControl(
ControlElement element,
const QStyleOption *option,
QPainter *painter,
const QWidget *widget
) const {
painter->save();
switch (element) {
case CE_HeaderSection:
{
const QStyleOptionHeader *headerOptionPtr(qstyleoption_cast<const QStyleOptionHeader *>(option));
if (headerOptionPtr && (headerOptionPtr->orientation == Qt::Vertical)) {
QProxyStyle::drawControl(element, option, painter, widget);
QAbstractItemView* abstractView(qobject_cast<QAbstractItemView*>(widget->parent()));
if (abstractView && abstractView->alternatingRowColors()) {
const QHeaderView *verticalHeader(qobject_cast<const QHeaderView *>(widget));
if (verticalHeader && verticalHeader->visualIndex(headerOptionPtr->section) % 2) {
painter->fillRect(option->rect, QColor(0, 0, 0, 30));
}
}
} else {
QProxyStyle::drawControl(element, option, painter, widget);
}
}
default:
QProxyStyle::drawControl(element, option, painter, widget);
break;
}
painter->restore();
}