如何在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
小部件的内部结构,您应该至少简要地了解一下它的实现。
就像标题描述的那样,当我重绘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
小部件的内部结构,您应该至少简要地了解一下它的实现。