qt - 将垂直标题添加到 QTreeView

标签 qt qt4 qtreeview qheaderview

我有一个 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/

相关文章:

c++ - Qt Creator 中最有用(高效)的快捷方式

c++ - Qt 4 - QProcess 问题

c++ - 多个 Qt 小部件描绘不同的 OpenSceneGraph 节点而没有性能损失

c++ - qt4宏检测KDE或GNOME

c++ - 如何使用 QTreeView 在 QComboBox 中选择项目

qt - 如何使用 QPushButton 获得 toggled() 信号?

qt - 用户选择项目时如何在委托(delegate)中关闭 QComboBox 编辑器

c++ - 在windows docker容器中编译Qt5项目

c++ - QTreeView 子节点总是指向第一个顶级节点

python - 将具有多列的子项添加到pyside中的qtreeview