Добавление вертикальных заголовков в QTreeView
-
21-09-2019 - |
Вопрос
у меня есть QTreeView
подкласс (и QAbstractItemModel
подкласс), который имеет красивый горизонтальный заголовок.Я хотел бы добавить вертикальные заголовки (спускающиеся по левой стороне), чтобы они соответствовали.Но в отличие от QTableView
который имеет отдельную вертикаль (setVerticalHeader()
) и горизонтальные заголовки (setHorizontalHeader()
), QTreeView
допускает только один заголовок (setHeader()
).
Я знаю, что могу просто представить, что крайний левый столбец является заголовком, и отобразить его с другим цветом фона (мне не нужна возможность изменять размер или переупорядочивать строки, поэтому мне не придется реализовывать какое-либо из этих специальных действий). ).Но это не учитывает местные стили.Например, в моей системе заголовки имеют небольшой градиент, что придает им почти трехмерный вид.
Поэтому я ищу способ добавить правильный вертикальный заголовок (я предполагаю, что это будет подкласс QHeaderView
) или же отрисовать заголовок в крайнем левом столбце, но отрисовать его правильно.
Решение
Вероятно, вы правы в том, что вам придется «притвориться», но вы сможете нарисовать его так, чтобы он выглядел так же хорошо, как и ваши горизонтальные заголовки.
Что вам нужно сделать, так это взять на себя ответственность paintEvent
для этих ячеек, а затем используйте текущий стиль для рисования пользовательского элемента управления.Что-то вроде:
//QWidget* w is the widget who's style you want
QPainter painter(this);
QStyleOptionHeader opt;
opt.initFrom(this);
opt.state = QStyle::State_None;
opt.orientation = Qt::Vertical;
opt.state |= QStyle::State_Vertical;
if (w->isEnabled())
opt.state |= QStyle::State_Enabled;
opt.state |= QStyle::State_Active;
w->style()->drawControl(QStyle::CE_Header, &opt, &painter, w);
Самый простой способ управлять событием рисования для нужных ячеек — создать собственный делегат элемента и переопределить метод virtual void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const = 0
метод.Вы просто связываете свою картину с интересующими вас индексами, а остальное передаете суперклассу (см. документацию Qt для этого класса).