설명 된 제목과 마찬가지로 헤더 (QHeaderView)가있는 QTreeView에서 스크롤 막대를 다시 그리지 만 스크롤 막대의 높이는 QTreeView의 전체 높이입니다. y 축에 QTreeView에서 스크롤 막대의 높이를 지정하는 방법
답변
당신의 문제에 대한 해결책은 QHeaderView
에서 취득한 constant_offset
값으로 세로 스크롤 막대의 위치를 설정 할 수 있습니다 (: 스크롤 바의 높이가 QTreeView의 높이를 뺀 아래의 그림과 같이 헤더의 height.just 동일).
이
는 서브 클래스에 의해 수행 될 수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
위젯의 내부를 엉망으로 만들고 싶다면 최소한 간단히 구현해야합니다.
이 작업을 수행 할 수 있지만 헤더 너비가 스크롤 막대 너비와 동일한 빈 간격이 있습니다. 어떻게 헤더에서 빈 간격을 제거 할 수 있습니까 ?? – Lomuto
겪고있는 것을 보여주는 이미지를 붙여 넣습니다. 스크롤 바 주위의 관심 영역만으로도 충분합니다. – Dusteh
[이처럼] (https://1drv.ms/i/s!AuRlDm0ORHE_hN4McM_n9FAw1_8S8w) – Lomuto