将垂直标头添加到QTreeView

时间:2009-12-27 22:22:08

标签: qt qt4 qtreeview qheaderview

我有一个QTreeView子类(和QAbstractItemModel子类),它有一个很好的水平标题。我想添加垂直标题(从左侧开始)以匹配。但与QTableView具有单独的垂直(setVerticalHeader())和水平标题(setHorizontalHeader())不同,QTreeView仅允许单个标题(setHeader())。

我知道我可以假装最左边的列是标题并使用不同的背景颜色呈现它(我不需要调整大小或重新排列行的能力,所以我不必实现任何那些特殊的行为)。但这并没有考虑到当地的风格。例如,在我的系统上,标题有一个轻微的渐变,给它们几乎3D外观。

因此,我正在寻找一种方法来添加一个正确的垂直标题(我猜它将是QHeaderView的子类)或者在最左边的列中呈现标题,但是将其呈现为正确的方式。

1 个答案:

答案 0 :(得分:3)

您可能必须“假装”,但您应该能够将其绘制成与水平标题一样好。

您需要做的是负责这些单元格的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文档)。