我有一个 QTreeView
子类(和 QAbstractItemModel
子类),它有一个漂亮的水平标题。我想添加垂直标题(从左侧向下)以匹配。但与具有单独的垂直 ( setVerticalHeader()
) 和水平标题 ( setHorizontalHeader()
) 的 QTableView
不同,QTreeView
仅允许单个标题 ( setHeader()
)。
我知道我可以假装最左边的列是标题并用不同的背景颜色渲染它(我不需要调整行大小或重新排列行的能力,所以我不必实现任何那些特殊的行为)。但这并没有考虑到本地的风格。例如,在我的系统上,标题有轻微的渐变,使它们具有近乎 3D 的外观。
因此,我正在寻找一种方法来添加适当的垂直标题(我猜测它将是 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);
负责您想要的单元格的绘制事件的最简单方法是创建一个自定义项委托(delegate)并重新实现virtual void Paint ( QPainter * Painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const = 0
方法。您只需将您的绘画门控到您关心的索引,然后将其余的传递给父类(super class)(请参阅该类的 Qt 文档)。
关于qt - 将垂直标题添加到 QTreeView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1967210/