2009-12-27 7 views
3

좋은 수평 헤더가있는 QTreeView 하위 클래스 (및 QAbstractItemModel 하위 클래스)가 있습니다. 나는 (왼쪽 아래로) 수직 헤더를 추가하여 일치시키고 싶다. 그러나 별도의 수직 (setVerticalHeader()) 및 수평 헤더 (setHorizontalHeader())가있는 QTableView과 달리 QTreeView은 단일 헤더 (setHeader()) 만 허용합니다.QTreeView에 세로 머리글 추가

가장 왼쪽의 열이 머리글이고 다른 배경색으로 렌더링되는 것처럼 느낄 수 있습니다. (행의 크기를 조정하거나 다시 정렬 할 필요가 없으므로 아무 것도 구현할 필요가 없습니다. 그 특별한 행동들). 그러나 그것은 지역 스타일을 고려하지 않습니다. 예를 들어, 제 시스템에서 헤더는 약간의 그라데이션을 가지므로 거의 3D 모양을 갖습니다.

그래서 적절한 수직 헤더를 추가하는 방법을 찾고 있는데 (예 : 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 문서 참조).

관련 문제