2016-12-27 43 views
0

就像所描述的标题,当我重绘QTreeView中有一个标题(QHeaderView)的滚动条,但滚动条的高度是QTreeView的整个高度,我想让滚动条的高度等于QTreeView则的高度减去头的height.just像下面的图片: just like this, exclude the height of header如何指定QTreeView中滚动条的高度

回答

0

用于您的问题的解决方案可能会垂直滚动条的位置设置从QHeaderView取得的constant_offset值(y轴上)。

这可以通过继承来完成的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(); 
    } 
}; 

根据sizePolicyupdateVertScrollBar方法可以被称为数据填充或作为样本实施提出可能会出现的每个更新刚过resizeEvent - 应该涵盖对小部件执行的各种大小调整。

编辑

另外去除收缩的滚动条留下的空白将是棘手的。首先表示QTreeView由视口小部件和滚动条(等等)构建而成。您现在看到的问题来自视口加垂直滚动条宽度(如果可见)应该匹配并且这是内部计算的事实。

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

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

+0

这是可以做到的,但在标题中有一个空白的空白,宽度等于滚动条的宽度,我怎样才能删除标题中的空白空白? – Lomuto

+0

粘贴显示您正在经历的图像。只有滚动条周围的感兴趣区域就足够了。 – Dusteh

+0

[就像这样](https://1drv.ms/i/s!AuRlDm0ORHE_hN4McM_n9FAw1_8S8w) – Lomuto