就像描述的标题一样,当我在QTreeView中重绘滚动条时,它有一个标题(QHeaderView),但滚动条的高度是QTreeView的整个高度,我想让滚动条's高度等于QTreeView的高度减去标题的高度。如下图所示:
答案 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
小部件的内部,你应该至少简单地完成它的实现。