我正在尝试将QVBoxLayout
放在QScrollArea
内,以使其可以垂直滚动。但是似乎没有添加项目。
我看到一个建议,我应该创建一个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()
一样。
答案 0 :(得分:8)
事实证明,通过将布局作为窗口小部件的布局,我走错了道路。实现这一目标的实际方法很简单:
scrollarea = QScrollArea(parent.widget())
layout = QVBoxLayout(scrollarea)
realmScroll.setWidget(layout.widget())
layout.addWidget(QLabel("Test"))
我很确定我最初尝试过,但嘿,它正在发挥作用。
然而这增加了一个问题,即布局的项目是垂直收缩的,而不是让滚动区域添加滚动条。
答案 1 :(得分:6)
重要的是阅读关于大小提示和布局的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;
}
}
我一直指向列表小部件,以便稍后我可以添加内容,这样可以正常工作。
答案 2 :(得分:2)
尝试拨打
self.realmScroll.setWidgetResizable(True)