2009-12-27 2 views
3

У меня есть подкласс QTreeView (и подкласс QAbstractItemModel), который имеет хороший горизонтальный заголовок. Я хотел бы добавить вертикальные заголовки (спускающиеся с левой стороны), чтобы они совпадали. Но в отличие от QTableView, который имеет отдельный вертикальный (setVerticalHeader()) и горизонтальные заголовки (setHorizontalHeader()), QTreeView допускает только один заголовок (setHeader()).Добавление вертикальных заголовков в QTreeView

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

Поэтому я ищу либо способ добавления правильного вертикального заголовка (я предполагаю, что это будет подкласс QHeaderView), либо рендеринг заголовка в крайнем левом столбце, но придание ему правильного пути.

ответ

2

Возможно, вы правы, что вам придется «притворяться», но вы должны иметь возможность рисовать его так же хорошо, как ваши горизонтальные заголовки.

Что вам нужно сделать, это отвечать за 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 для этого класса).

Смежные вопросы