Я пытаюсь изменить цвет фона для определенных разделов заголовка. Некоторые будут использовать расцветку по умолчанию, другие получат другой цвет.
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, он будет рисовать заполненный прямоугольник, но не очень последовательно (т.е. щелчок и изменение размера заголовка заставляет его иногда заполнять, а не другие).
Любая помощь приветствуется.
Нет необходимости реализовывать что-либо. 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);
Я согласен с таблицами стилей "Харальд Шейрих" - это путь. Но, возможно, чтобы убедить вас, я расскажу вам о менее известной части таблиц стилей, называемых 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 переоценивает стиль виджета. В противном случае вы, вероятно, не увидите изменения.
И в основном, что это. Надеюсь, это поможет.
Я думаю, вам не нужно ничего переоценивать. Посмотрите на свойство palette
QWidget.