2016-07-11 1 views
0

QScrollArea에서 위젯을 동적으로 추가 및 제거하고 스크롤 막대가 나타나기 전에 동시에 최대 4 개의 위젯을 표시하고 싶습니다. 그래서 기본적으로 0-3 위젯이 있고 다른 위젯을 추가하면 스크롤 영역이 새 높이에 맞게 크기가 조정 된 후 높이가 4 위젯 크기로 유지되고 스크롤하면 5, 6, ...Qt : 최대 4 개의 위젯을 표시하도록 QScrollArea 크기 조정

현재 위젯을 삽입/제거 할 때 다음 메소드를 호출합니다.

void WidgetList::resizeScrollArea() 
{ 
    // height of the first four widgets 
    int widgetsHeight = 0; 
    for (int i = 0; i < _widgets.size() && i < 4; ++i) 
    { 
     // height of a widget 
     widgetsHeight += _widgets.at(i)->sizeHint().height(); 
    } 
    // some leeway to make sure we have some gap between the widgets 
    _ui->scrollArea->setFixedHeight(widgetsHeight + 5); 
} 

문제는 힌트 (sizehint)()을 (때로는 너무 큰) 올바른 높이가 항상되지 않는 것입니다,하지만 둘 다 크기() (너무 작은 자주). 따라서 스크롤 영역은 내용에 비해 너무 크지 만 때때로 작동합니다.
내 위젯이 모두 같은 높이가 아닌 경우가 있으며, 때로는 sizeHint가 올바른 것으로 보이며 때로는 크기입니다.
sizeHint는 위젯이 갖고 싶어하는 크기이며, 레이아웃이 제공하는 크기가 아니라는 것을 이해합니다. 그러나 크기가 올바르지 않은 이유는 알 수 없습니다.

내가 어떻게해야하는지에 대한 아이디어는 가장 높이 평가 될 것입니다.

+0

[this answer] (http://stackoverflow.com/a/21265287/1329652)를보십시오. –

답변

0

고정 높이를 설정하는 대신 sizeHint()을 재정의해야 위젯이 원하는 크기로 되돌릴 수 있습니다 (레이아웃이 약간의 여분을 줄 수 있거나 필요하면 약간 줄 수 있도록). 첫 번째 4 개의 하위 위젯 중 하나가 변경 될 때마다 invalidate()으로 전화하여 포함 된 레이아웃에 이전 캐시 된 값을 다시 계산해야 함을 알릴 수 있습니다.

귀하의 위젯이 모두 QVBoxLayout (추측하고 있지만 추측하는 것이 합리적입니다) 인 경우, 계산에서 간격과 위쪽 여백을 검색해야합니다.

관련 문제