Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top