2011-07-03 72 views
22

我试图把QVBoxLayoutQScrollArea,以便它是滚动垂直。然而,物品似乎并未添加到它。如何创建一个可滚动QVBoxLayout?

我看到了一个建议,我应该创建一个在ScrollArea使用并把里面的布局内构件,但似乎工作不。我的结构应该是这样的:

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

和代码来做到这一点:

# 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")) 

我还在学习的Qt(2天),因此在深入回答我在哪里我会错误的将不胜感激。

更新

看来,addWidget(QLabel())作品的权利,直到在realmScrollInner已经被设置为realmScroll的部件。因为我想添加元素UI显示后我不得不这样做,这我不知道真的是正确的:

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的小部件有前被绑定(这样布局具有没有窗口小部件),然后结合后来加入的不显示ScrollArea小部件。也许ScrollArea需要重绘(虽然我没有看到一个方法)?

更新2:调用上realmScroll或其包含插件repaint()什么都不做也呼吁布局activate/update()

回答

2

尝试调用

self.realmScroll.setWidgetResizable(True) 
8

原来,我是通过将布局作为一个小窗口的布局带领下来一个错误的道路。这样做的实际方法很简单,只要:

scrollarea = QScrollArea(parent.widget()) 
layout = QVBoxLayout(scrollarea) 
realmScroll.setWidget(layout.widget()) 

layout.addWidget(QLabel("Test")) 

这一点我敢肯定,我想最初,但嘿它的工作。

然而这增加了布局的项目,而不是垂直缩水导致scrollarea添加滚动条的问题。

+0

我刚刚有一个非常类似的问题,请参阅此处的解决方案:http://stackoverflow.com/q/12781407/432913 – will

6

OK,我刚刚完成的这个战斗。这里有一个小部件,可以进入滚动区域(scrollarea-> setWidget)和正常工作。它包含一个QVBoxLayout和一个标签/ listwidget对的列表,每个对象都有自己的小水平布局,并且它几乎完成了你想要的任务。

最重要的事情是阅读大小提示和布局的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; 
    } 
} 

我保留指向列表小部件的指针,这样我可以稍后添加东西给他们,并且工作正常。

相关问题