2014-01-20 4 views
1

현재 여러 페이지가있는 QStackedWidget으로 구성된 응용 프로그램을 만들고 있습니다. 페이지 자체가 디자이너에 추가되었습니다. 나는 무엇 (코드) 수행 할 수 있습니다StackedWidget 페이지에 QScrollArea를 동적으로 추가하고 위젯을 추가하는 방법은 무엇입니까?

  • 를 페이지
  • 에 QVBoxLayout를 추가 페이지이 아주 잘 작동

위해에

  • 세트 레이아웃을 일부 사용자 정의 위젯을 추가, 나는 내 위젯이 페이지에 표시되는 것을 볼 수 있습니다. 이 위젯의 ​​높이는 25로 고정되어 있습니다. 위젯이 너무 많으면 모든 것을 볼 수 없습니다. 작동하지 않는 것은 페이지에 위젯이 많이 추가 될 경우를 대비하여 위 아래로 스크롤 할 수있는 페이지에 QScrollArea을 추가하는 것입니다.

    //The header file: 
    
    QVBoxLayout *valuesLayout; 
    
    //The corresponding .cpp file 
    
    valuesLayout = new QVBoxLayout(); 
    valuesPage->setLayout(valuesLayout); //valuesPage is my QStackedWidget page 
    for (int j=0; j<100; j++) 
    { 
        valuesLayout->addWidget(new PaIndicator(0, "This is a test", 0)); // my custom widgets 
    } 
    

    내가 변경해야 할 것입니다 방법/내 위젯이 QScrollArea에 표시되도록 위의 코드를 확장 : "있는 그대로"

    그래서 여기가 상황에 내 코드?

    업데이트 : 이 enter image description here

    내 현재 코드가 정확히 SHF의 대답에 주어진 라인과 같습니다 :이와 결국 아래에 언급 된 변경 사항을 적용 후. 나는 점점 더 가까워지고 있다고 느끼지만, 여전히 뭔가 잘못된 것 같습니다.

  • 답변

    3

    당신은 당신의 스크롤 영역에 set a widget에 있고 그 위젯에 내용을 추가

    QScrollArea *scrollArea = new QScrollArea; 
    QWidget *scrollWidget = new QWidget; 
    scrollWidget->setLayout(new QVBoxLayout); 
    scrollArea->setWidget(scrollWidget); 
    for (int j=0; j<100; j++) 
    { 
        scrollWidget->layout()->addWidget(new PaIndicator(0, "This is a test", 0)); // my custom widgets 
    } 
    

    그런 다음 누적 위젯의 페이지에 스크롤 영역을 추가하십시오.

    valuesLayout->addWidget(scrollArea); 
    
    +0

    그랬습니다. 한 가지 중요한 점은 위의 솔루션을 사용하면 추가 된 (내부) 위젯을 레이아웃에 추가 할 때 (일반적으로 고정 높이, 수평으로 확장)와 같이 확장하지 않는다는 것입니다. 이 동작을 사용하려면 다음과 같이 설정해야합니다. scrollArea-> setWidgetResizable (true); – Robert

    +1

    @ 로버트 : 누락 된 것은'layout() -> setSizeConstraint (QLayout :: SetMinAndMaxSize)'호출입니다. 하나는'scrollArea-> setWidgetResizable'을 호출 할 필요가 없다. 전자는 명확하게 의도 된 것을 표현할 수 있습니다. 위젯은 내용에 맞게 필요한만큼 커야합니다. –

    1

    valuesLayout에만 QScrollArea 개체를 추가해야합니다 (예 : scrollArea). 당신은 지금 당신이 scrollLayout에 위젯을 추가 할 수 있습니다,의는 scrollLayout을 가정 해 봅시다,의는 scrollWidget을 말하고 scrollWidget에 대한 QVBoxLayout을 설정할 수, scrollArea에있을 것이다, QWidget을 만들어야하고 그들은 당신의 QScrollArea 내부에 나타납니다, 그래서 코드처럼 보일 것이다 이 (가 조금 까다 롭고 cofusing하지만 시간이 쉬운 것입니다) :

    //The header file: 
    
    QVBoxLayout *valuesLayout; 
    QVBoxLayout *scrollLayout; 
    QScrollArea *scrollArea; 
    QWidget *scrollWidget; 
    
    //The corresponding .cpp file 
        valuesLayout = new QVBoxLayout(); // creating layout for valuesPage 
        scrollArea=new QScrollArea(valuesPage); // creates scrollarea, and set valuesPage as it's parent 
        scrollWidget =new QWidget(scrollArea); // creates scrollwidget, your scrollArea as parent 
        scrollLayout = new QVBoxLayout(scrollWidget); // creating layout in scrollWidget 
        for (int j=0; j<100; j++) 
        { 
         scrollLayout->addWidget(new PaIndicator(0, "This is a test", 0)); // adding your widgets to scrolllayout 
        } 
        scrollArea->setWidget(scrollWidget); // sets scrollArea around scrollWidget 
        valuesPage->setLayout(valuesLayout); //valuesPage is my QStackedWidget page 
        valuesLayout->addWidget(scrollArea); // adding scrollwidget to your mainlayout 
    
    +0

    답변을 주셔서 감사합니다. 지금 구조를 이해합니다. 불행히도 스크롤바가 없으므로 예상대로 작동하지 않고 상황이 다소 복잡해 보입니다. 첫 번째 게시물을 업데이트하고 이미지를 추가했습니다. – Robert

    +1

    @ 로버트 당신이 옳았는데, 몇 가지 실수가 있었고, 그것들을 고치고, 업데이트 된 코멘트를 잊어 버렸습니다. QScrollArea :: setWidget() – Shf

    관련 문제