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

时间:2016-12-27 08:15:01

标签: qt scrollbar qtreeview redraw

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

1 个答案:

答案 0 :(得分:0)

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

这可以通过继承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进行更新 - 这应包括各种调整大小执行到小部件。

修改

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

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

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