Этот вопрос является дальнейшим развитием эта почта и отличается, хотя может показаться похожим, как этот.
Я пытаюсь переопределить QHeaderView::paintSection
, так что фон, возвращенный из модели, будет учтен. Я пытался сделать это
void Header::paintSection(QPainter * painter, const QRect & rect, int logicalIndex) const
{
QVariant bg = model()->headerData(logicalIndex, Qt::Horizontal, Qt::BackgroundRole);
// try before
if(bg.isValid()) // workaround for Qt bug https://bugreports.qt.io/browse/QTBUG-46216
painter->fillRect(rect, bg.value<QBrush>());
QHeaderView::paintSection(painter, rect, logicalIndex);
// try after
if(bg.isValid()) // workaround for Qt bug https://bugreports.qt.io/browse/QTBUG-46216
painter->fillRect(rect, bg.value<QBrush>());
}
Тем не менее, это не сработало — если я сделаю QHeaderView::paintSection
звоните, ничего, что я рисую с художником, не видно (я также пытался нарисовать диагональную линию). Если я удалю QHeaderView::paintSection
звоните, линия и фон будут видны.
Делая fillRect
звонить до или после QHeaderView::paintSection
не имеет никакого значения.
Интересно, что это такое QHeaderView::paintSection
делает ли это невозможным для меня нарисовать что-то поверх этого?
И есть ли способ преодолеть его, не претворяя в жизнь все, что QHeaderView::paintSection
делает?
Все, что мне нужно сделать, это добавить определенный оттенок к определенной ячейке — я все еще хочу, чтобы все в ячейке (текст, значки, градиентный фон и т. Д.) Было нарисовано, как сейчас …
Очевидно, почему первый fillRect
не работает Все, что вы рисуете раньше paintSection
перекрывается базовой окраской.
Второй звонок интереснее.
Обычно все методы рисования сохраняются painter
государство. Это означает, что когда вы звоните paint
похоже, что состояние художника не изменилось.
тем не менее QHeaderView::paintSection
портит состояние художника.
Чтобы обойти проблему, вам нужно самостоятельно сохранить и восстановить состояние:
void Header::paintSection(QPainter * painter, const QRect & rect, int logicalIndex) const
{
QVariant bg = model()->headerData(logicalIndex, Qt::Horizontal, Qt::BackgroundRole);
painter->save();
QHeaderView::paintSection(painter, rect, logicalIndex);
painter->restore();
if(bg.isValid())
painter->fillRect(rect, bg.value<QBrush>());
}