向 QTreeView 添加垂直标题

Ada*_*kin 5 qt qt4 qtreeview qheaderview

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

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

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

gab*_*ing 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);
Run Code Online (Sandbox Code Playgroud)

负责所需单元格的绘制事件的最简单方法是创建自定义项委托并重新实现该virtual void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const = 0方法。您只需将您的绘画门控到您关心的索引,然后将其余的传递给超类(请参阅该类的 Qt 文档)。