2015-01-08 4 views
1

나는 위젯을 많이 포함 할 QGridLayout입니다. 루프가 너무 많은 위젯을 추가하고 페이지에 모두 들어갈 수없는 문제가 발생했습니다. 스크롤 막대를 추가하고 싶지만 올바르게 표시되지 않습니다.Qt의 격자 레이아웃에 스크롤 막대를 추가하는 방법은 무엇입니까?

이 기능은 메인 레이아웃에 추가 탭, 그것은 그리드 레이아웃을 포함 반환

QTabWidget *RegistersTab::createTab() 
{ 
    QTabWidget *tab = new QTabWidget(this); 

    std::vector<QGridLayout*> loVec; //to add to master layout 

    for(int i=0; i<2; i++) //number of pages 
    { 
     QWidget *client = new QWidget(this); //this part breaks it 
     QScrollArea *scrollArea = new QScrollArea(this); 
     scrollArea->setWidget(client); 

     QTabWidget *tabPage = new QTabWidget(client); 

     QGridLayout *loGrid = new QGridLayout(client); 
     tabPage->setLayout(loGrid); 

     QString title = QString("Page %1").arg(i); 
     tab->addTab(tabPage, title); 

     loVec.push_back(loGrid); 
    } 
    m_loGridVec.push_back(loVec); 

    return tab; 
} 

GridLayout 벡터가 그래서 위젯을 추가 할 수 있으며 나중에 조작입니다. 지금은 탭 상단에 회색 상자가 생기므로 뭔가 문제가 발생합니다. 스크롤 영역을 제거하고 (client)(this)으로 설정하면

나는 간단한 수정이 필요하다고 생각하니?

EDIT (탭이 어떻게 만들어 지는지) :

ui->lo->addWidget(m_tab); 

m_tab->addTab(createTab(), title); // m_tabCbc is a QTabWidget; 
+0

당신은 어디서나 스크롤 영역을 추가하지 않는 :

그것은이 같은해야한다. 'QTabWidget' ('this') 안에있을 것입니다. 내가 알 수있는 한, 그것은 어떤 페이지 안에 있어야합니다. 그러나 다른 탭 위젯을 페이지로 추가하고 있습니다. 또한 이상한 이유로 레이아웃을 레이아웃에 설정하고 있습니다. 'tabPage'는 단지'QWidget'이 아니어야합니까? – thuga

+0

실제로 중첩 탭이 있습니다. 그래서 각각에 "i"서브 시스템이 들어있는 "N"개의 모듈이 있다고 가정하면 중첩 된 탭이 필요합니다. 그 부분이 작동, 난 그냥 스크롤바에 미끄러 져하는 방법을 알아낼 수 없다 – fiz

+1

그럼 난 스크롤 영역은 어딘가에 하위 탭 페이지에 있어야한다고 가정합니다. 'tabPage' 위젯을위한 페이지를 추가하고 그 레이아웃 안에 스크롤 영역을 추가해야합니다. – thuga

답변

3

경우에 당신은 잘못된 방법으로 양육 메커니즘을 사용하고 생각합니다. QTabWidget (this) 안에있을 것입니다.

위에서 언급했듯이 중첩 된 탭이 필요합니다. 따라서 tabPage 위젯에 페이지를 추가하고 레이아웃 내부에 스크롤 영역을 추가해야합니다.

tabPage 
    => pageWidget(QWidget) 
     => layout 
      => scrollArea 
       => scrollAreaWidget(client?) 
        => layout(loGrid) 

QWidget *client = new QWidget; 
QScrollArea *scrollArea = new QScrollArea; 
scrollArea->setWidgetResizable(true); 
scrollArea->setWidget(client); 
QGridLayout *loGrid = new QGridLayout; 
client->setLayout(loGrid); 

QTabWidget *tabPage = new QTabWidget; 
QWidget *pageWidget = new QWidget; 
pageWidget->setLayout(new QVBoxLayout); 
pageWidget->layout()->addWidget(scrollArea); 
tabPage->addTab(pageWidget, "Page");  

QString title = QString("Page %1").arg(i); 
tab->addTab(tabPage, title); 
+0

우수, 감사했습니다. 그리고 육아 시스템을 조금이라도 이해해 주셔서 감사합니다! – fiz

+1

@fiz 레이아웃에 위젯을 추가하면 레이아웃 위젯에 위젯이 자동으로 다시 표시됩니다. 레이아웃을 위젯으로 설정하면 레이아웃의 소유권을 갖게됩니다. 그렇기 때문에 부모님을 항상 부모로 삼을 필요는 없습니다. 위젯을 스크롤 영역에 설정하거나 페이지를 'QTabWidget'에 추가 할 때도 같은 일이 발생합니다. 그들은 위젯의 소유권을 가지고 있습니다. – thuga

0

난 당신이합니다 (GridLayout과 "번들"에이 간단한는 QWidget (예를 들어, '클라이언트'), 당신의 GridLayout과 그것의 레이아웃을 설정할 필요하다고 생각 위젯). 그런 다음 해당 위젯을 원하는 스크롤바 동작을 추가 할 스크롤 영역에 넣은 다음 반환 할 기본 위젯에 추가합니다.

편집 : 나는 당신은 어디서나 스크롤 영역을 추가하지 않는 즉

QWidget *client = new QWidget(this); //creates a new widget which has "this" as its parent, meaning it will be deleted if "this" is destroyed 
QGridLayout *loGrid = new QGridLayout(client); //a layout with client as its parent 
QGridLayout *loGrid2 = new QGridLayout(); 
loGrid2->addWidget(xyz) 
client->setLayout(loGrid2); //I think this is what you want 
+0

나는 네가 옳다고 생각해, 육아는 틀렸지 만, 현재 스크롤을 추가 할 해결책을 찾지 못했습니다. – fiz

+0

또한이 예에서 loGrid가 올바르게 사용되지 않고 있습니까? – fiz

관련 문제