Добавление вертикальных заголовков в QTreeView

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

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

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


person Adam Batkin    schedule 27.12.2009    source источник


Ответы (1)


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

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

person gabeiscoding    schedule 29.12.2009