Как изменить цвет фона для заголовка QTreeView (он же QHeaderView)?

1

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

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, он будет рисовать заполненный прямоугольник, но не очень последовательно (т.е. щелчок и изменение размера заголовка заставляет его иногда заполнять, а не другие).

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

Теги:
user-interface
qt
pyqt
paint

3 ответа

2
Лучший ответ

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

Редактировать:

Вы упомянули, что хотите изменить цвет фона на столбец в зависимости от данных, самый простой способ сделать это - это, вероятно, получить новую модель из QAbstractItemModel или другого класса модели и повторно headerData() вызов 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
    Таблицы стилей и палитры являются глобальными настройками для стилей. Мне нужно иметь возможность динамически менять стиль (то есть цвет фона) в зависимости от отображаемых данных.
  • 0
    Обновлен с решением, которое может сделать то, что вам нужно, Брендан
Показать ещё 1 комментарий
0

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

Если вы посмотрите на таблицы стилей док здесь, вы увидите небольшой раздел о них. В основном то, что мы делаем, это указание таблицы стилей для этих виджетов с определенным набором свойств. Например, все QPushButtons, которые являются плоскими.

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

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

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

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

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

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

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

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

  • 0
    Спасибо, я не знал об этой функции таблиц стилей. К сожалению, это все еще не помогает мне, потому что QHeaderView содержит только одно свойство таблицы стилей для установки цвета фона и применяется ко всем разделам заголовка. Мне нужно иметь возможность менять цвет фона для каждого раздела отдельно. Возможно, если бы был какой-то способ установить свойства для подэлемента Section?
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню