2011-07-03 4 views
22

QVBoxLayoutQScrollArea 안에 넣으려고 수직으로 스크롤 할 수 있습니다. 그러나 항목이 추가되지 않는 것 같습니다.스크롤 가능한 QVBoxLayout을 만드는 방법은 무엇입니까?

나는 ScrollArea가 사용하는 내부 위젯을 생성하고 그 안에 레이아웃을 배치해야한다는 제안을 보았습니다.하지만 작동하지 않는 것 같았습니다. 내 구조는 다음과 같이 가정한다 : 나는 곳으로

# Irrelevant, added for context (this works) 
centralWidget = QWidget(self) 
self.container = QVBoxLayout(centralWidget) 
centralWidget.setLayout(self.container) 
self.setCentralWidget(centralWidget) 

# Where trouble starts 
self.realmScroll = QScrollArea(self.container.widget()) 
self.realmScroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) 

self.realmLayout = QVBoxLayout(self.container.widget()) 

self.realmScrollInner = QWidget(self.realmScroll) 
self.realmScrollInner.setLayout(self.realmLayout) 

self.realmScroll.setWidget(self.realmScrollInner) 
self.container.addWidget(self.realmScroll) 

# Doesn't add to realmLayout 
self.realmLayout.addWidget(QLabel("test")) 

나는 아직도 (2 일) Qt를 배우고, 그래서 깊이있는 답변을 :

+------------------------------- 
| QScrollArea(realmScroll) 
| +---------------------------- 
| | QWidget(realmScrollInner) 
| | +------------------------- 
| | | QVBoxLayout(realmLayout) 

그리고 코드는 이렇게 잘못 될 경우 고맙겠습니다.

업데이트는 :

바로 위로 realmScrollInner까지 addWidget(QLabel()) 작품 realmScroll의 위젯으로 설정되어있는 것으로 보인다.

self.realmLayout.addWidget(QLabel("test")) 

# realmScrollInner bound to realmScroll 
realmScroll.setWidget(realmScrollInner) 
self.container.addWidget(realmScroll) 

# Access realmScroll's widget and then layout to add 
realmScroll.widget().layout().addWidget(QLabel("test")) 

하지만 addWidget에 그 첫 번째 통화를 제거하면 위젯이 전에 : UI는 내가 확실하지 않다하는이 작업을 수행해야 표시 한 후 내가 요소를 추가 할 때문에 정말 정확 (레이아웃에 위젯이 없다), 이후에 추가 된 ScrollArea 위젯에 바인딩은 표시되지 않습니다. 아마도 ScrollArea는 다시 칠할 필요가 있습니다 (그러나 그 방법은 없습니다).

업데이트 2 : 레이아웃에 activate/update()를 호출 않는 realmScroll 또는 포함 된 위젯 repaint() 호출은 아무것도하지 않습니다.

답변

2

시도 그것은 내가 위젯의 레이아웃으로 레이아웃을 넣어 잘못된 길을 이끌 것을 밝혀졌다

self.realmScroll.setWidgetResizable(True) 
8

를 호출. 이 작업을 수행하는 실제 방법은 다음과 같이 간단합니다.

나는 원래 시도했지만 확신하고 있습니다.

이 경우 스크롤 영역에 스크롤바를 추가하는 대신 레이아웃의 항목이 세로로 축소된다는 문제가 추가됩니다.

+0

방금 ​​이와 비슷한 문제가있었습니다. 여기에 해결책을보십시오 : http://stackoverflow.com/q/12781407/432913 – will

6

좋아요, 이제 막 이것으로 싸워 왔습니다. 스크롤 영역 (scrollarea-> setWidget)에 들어가서 올바르게 작동 할 수있는 위젯이 있습니다. 그것은 QVBoxLayout과 레이블/목록 위젯 쌍의 목록을 포함하고 있습니다. 각 목록은 각각의 작은 가로 레이아웃으로되어 있으며 원하는대로 할 수 있습니다.

중요한 것은 크기 힌트 및 레이아웃에 대한 QScrollArea 문서 섹션을 읽고 레이아웃에서 sizeContraint QLayout :: SetMinAndMaxSize를 갖는 비트가 필요한 부분을 찾는 것이 었습니다.

class MappingDisplayWidget : public QWidget 
{ 
    Q_OBJECT 
public: 
    explicit MappingDisplayWidget(QWidget *parent = 0); 
    void addFile(QString name); 
private: 
    QVBoxLayout *m_layout; 
    QMap<QString, QListWidget *> m_mappings; 
}; 


MappingDisplayWidget::MappingDisplayWidget(QWidget *parent) : 
    QWidget(parent) 
{ 
    m_layout = new QVBoxLayout; 
    m_layout->setSizeConstraint(QLayout::SetMinAndMaxSize); 
    setLayout(m_layout); 
} 


void MappingDisplayWidget::addFile(QString name) { 
    if (m_mappings.find(name) == m_mappings.end()) { 
     QWidget *widg = new QWidget; 

     QHBoxLayout *lay = new QHBoxLayout; 
     widg->setLayout(lay); 

     QLabel *nlab = new QLabel(name); 
     lay->addWidget(nlab); 

     QListWidget *list = new QListWidget; 
     lay->addWidget(list); 

     m_layout->addWidget(widg); 

     m_mappings[name] = list; 
    } 
} 

목록 위젯에 대한 포인터를 유지하므로 나중에 항목을 추가 할 수 있습니다.

관련 문제