如何在QTreeView中指定滚动条的高度

how to specify the height of scrollbar in QTreeView

就像标题描述的那样,当我重绘QTreeView中的滚动条时,它有一个header(QHeaderView),但是滚动条的高度是QTreeView的整个高度,我想让滚动条的高度等于QTreeView 的高度减去 header 的 height.just,如下图所示:

您的问题的解决方案可能是将垂直滚动条的位置设置为从 QHeaderView(在 y 轴上)获取的 constant_offset 值。

这可以通过子类化 QTreeView 来完成,如下所示:

class MyTreeView : public QTreeView
{
public:
    MyTreeView(QWidget* parent = nullptr): QTreeView(parent){}

    void updateVertScrollBar()
    {
        auto* ptr = verticalScrollBar();
        QRect rect = ptr->geometry();
        rect.setTop(header()->height());
        ptr->setGeometry(rect);
    }

    void resizeEvent(QResizeEvent* ev) override
    {
        QTreeView::resizeEvent(ev);
        updateVertScrollBar();
    }
};

根据 sizePolicy,可以在填充数据后立即调用 updateVertScrollBar 方法,或者如示例实现中所示,每个 resizeEvent 都可以进行更新 - 这应该涵盖对小部件执行各种调整大小。

编辑

此外,从缩小的滚动条中删除空白 space 会很棘手。首先表示 QTreeView 是从视口小部件和滚动条(以及其他)构建的。您现在看到的问题来自于视口加上垂直滚动条宽度(如果可见)应该匹配并且这是内部计算的。

我说过这很棘手,因为当您尝试强制调整这些组件的大小时会发生很多事情。有些更新是就地调用的,有些是通过事件循环调用的。您可以查看 this 以获取有关该概念的更多详细信息。类似的方法可能适用于 QTreeView.

基本上您需要做的是拉伸视口宽度。这可能应该在 resizeEvent 期间完成,但是从那里调用 viewport()->setGeometry() 之类的方法可能不会很好地结束 - 您可能会陷入循环。您可以尝试 blockSignals,但我不确定这是否有帮助。一般来说,如果您想弄乱给定 Qt 小部件的内部结构,您应该至少简要地了解一下它的实现。