Как изменить цвет фона для заголовка QTreeView (он же QHeaderView)? - PullRequest
1 голос
/ 08 сентября 2011

Я пытаюсь изменить цвет фона для определенных разделов заголовка. Некоторые будут использовать окраску по умолчанию, другие получат другой цвет.

HeaderView не принимает делегатов, как QTreeView; он делает всю картину сам. Это делается двумя способами -

Моя первая попытка состояла в том, чтобы попытаться переопределить paintSection, позволить ему рисовать материал по умолчанию, а затем добавить свой собственный.

def paintSection(self, painter, rect, logicalindex):
    QHeaderView.paintSection(self, painter, rect, logicalindex)
    painter.save()
    painter.fillRect(rect, QBrush(Qt.red))
    painter.restore()

Это, похоже, ничего не делает. Он не будет рисовать заполненный прямоугольник. Если я закомментирую вызов базового метода paintSection, он будет рисовать заполненный прямоугольник, но не очень согласованно (т. Е. Щелчок и изменение размера заголовка иногда приводит к его заполнению, а не к другим).

Любая помощь приветствуется.

Ответы [ 3 ]

2 голосов
/ 08 сентября 2011

Нет необходимости реализовывать что-либо QHeaderView можно изменить с помощью таблиц стилей , как почти все виджеты.

Edit:

Вы упомянули, что хотите изменить цвет фона для каждого столбца в зависимости от данных. Самый простой способ сделать это, вероятно, - извлечь новую модель из QAbstractItemModel или другого класса модели и переопределить вызов headerData()

QVariant QAbstractItemModel::headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const [virtual]

роль, на которую вы хотите отреагировать, - Qt::BackgroundColorRole, поэтому функция может выглядеть следующим образом

QVariant VariableHeaderModel::headerData(int section Qt::Orientation orientation, int role)
{
  QVariant result;
  if (role == Qt::BackgroundColorRole)
  {
    result = <QColor from custom processing>
  }
  else
  {
    result = Superclass::headerData(section, orientation, role);
  }
  return result;
}

Как правило, в Qt модель решает, что показывать, почти все время меняется модель, а не представление. Также часто вызываются вызовы data (), я не знаю насчет headerData (), но вы, вероятно, захотите кэшировать любые результаты, если происходит много вычислений.

Если вы используете QStandardItemModel, вы можете просто позвонить

setHeaderData(section, orientation, <aColor>, Qt::BackgroundColorRole);
0 голосов
/ 09 сентября 2011

Я согласен с таблицами стилей "Харальд Шейрих". Но, возможно, чтобы убедить вас, я расскажу вам о менее известной части таблиц стилей, называемой Property Selectors

Если вы посмотрите на таблицу стилей doc здесь , вы увидите небольшой раздел о них. По сути, мы задаем таблицу стилей для тех виджетов с определенным набором свойств. Например, все плоские кнопки QPushButton.

QPushButton[flat="true"]
{
   background-color: blue
}

Теперь, хотя это довольно круто, само по себе это не очень вам помогает. Что еще более удивительно, вы можете добавить свои собственные свойства в QObject. Они известны как динамические свойства. И они также могут быть использованы в селекторах свойств

Таким образом, я мог бы создать такую ​​таблицу стилей, например, где highlightHeader - это мое готовое свойство

QHeaderView[highlightHeader="true"] 
{ 
   background-color: red
}

Теперь вы можете применять эту таблицу стилей глобально к каждому QHeaderView. Но так как никто не устанавливает truelightHeader в true, мы не увидим нигде красного Поэтому следующий шаг - когда мы решаем, что мы хотим сделать конкретный QHeaderView красным, тогда мы вызываем это:

myHeaderView->setProperty("highlightHeader", true);
myHeaderView->style()->unpolish(myHeaderView);
myHeaderView->style()->polish(myHeaderView);

В первой строке мы устанавливаем свойство для запуска нужного нам состояния. Следующие две строки должны гарантировать, что Qt переоценивает стиль виджета. В противном случае вы, вероятно, не увидите изменения.

И в основном это все. Надеюсь, это поможет.

0 голосов
/ 08 сентября 2011

Я думаю, вам не нужно ничего переопределять.Взгляните на свойство palette QWidget.

...