5

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

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

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

4

1 回答 1

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 的此类文档)。

于 2009-12-29T14:51:56.220 回答