Что делает QHeaderView :: paintSection так, что все, что я делаю с художником до или после, игнорируется

Этот вопрос является дальнейшим развитием эта почта и отличается, хотя может показаться похожим, как этот.

Я пытаюсь переопределить 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 делает?

Все, что мне нужно сделать, это добавить определенный оттенок к определенной ячейке — я все еще хочу, чтобы все в ячейке (текст, значки, градиентный фон и т. Д.) Было нарисовано, как сейчас …

3

Решение

Очевидно, почему первый 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>());
}
6

Другие решения


По вопросам рекламы [email protected]