我有一个QScrollArea小部件,它开始为空;
它有一个垂直布局,带有QGridLayout和一个垂直间隔,使其保持在顶部,并防止它在整个滚动区域上伸展;
在程序的其他地方,有一个QTextEdit,当更改时,其内容扫描“种类”元素,然后将它们添加到QGridLayout。已经除去的任何物种元素也被除去。这个位有效;
我一直打开垂直滚动条,所以当它出现时它不会位于那里的其他东西之上。请注意,尽管不需要滚动条,但滚动条大于滚动框。
这就是问题所在。滚动区域似乎是预设的,我无法更改它。如果我向QGridLayout添加更多行,则滚动区域的大小不会增加。
相反,它保持相同的大小,并挤压QGridLayout,使其看起来很丑陋(起初);
然后在添加更多之后它变得无法使用;
请注意,滚动条仍然与之前的图像大小相同。前两个图像来自Qt Designer,后面的三个图像来自正在运行的程序。
如果我调整窗口大小以使QScrollArea增长,那么我会看到:
表示滚动区域内部的某些布局没有正确调整大小。
我的问题是; 当我在QGridLayout中添加和删除时,我需要做什么才能使窗口小部件的可滚动区域动态调整大小?
答案 0 :(得分:24)
documentation提供了答案:
widgetResizable:bool
此属性保存滚动区域是否应调整视图窗口小部件的大小。 如果此属性设置为false(默认值),则滚动区域将遵循其窗口小部件的大小。
将其设置为true。
答案 1 :(得分:20)
如果你是从谷歌来到这里并且没有幸运接受的答案,那是因为你错过了另一个秘密调用:QScrollArea::setWidget
。您必须创建并显式标识要滚动的单个窗口小部件。仅仅作为孩子添加项目是不够的!直接向ScrollArea
添加多个项目也不起作用。
此脚本演示了QScrollArea的一个简单工作示例:
from PySide.QtGui import *
app = QApplication([])
scroll = QScrollArea()
scroll.setWidgetResizable(True) # CRITICAL
inner = QFrame(scroll)
inner.setLayout(QVBoxLayout())
scroll.setWidget(inner) # CRITICAL
for i in range(40):
b = QPushButton(inner)
b.setText(str(i))
inner.layout().addWidget(b)
scroll.show()
app.exec_()
答案 2 :(得分:-1)
为什么不为行使用QListView,它会为您管理所有问题?只需确保在添加它之后单击Class(设计器的右上方窗口)并指定布局或者它不会正确扩展。
我在QScrollArea中使用QLIstWidget来制作可滚动的图像列表
尝试将其他对象添加到列表中,这就是我将图像添加到列表中的方式。
QImage& qim = myclass.getQTImage();
QImage iconImage = copyImageToSquareRegion(qim, ui->display_image->palette().color(QWidget::backgroundRole()));
QListWidgetItem* pItem = new QListWidgetItem(QIcon(QPixmap::fromImage(iconImage)), NULL);
pItem->setData(Qt::UserRole, "thumb" + QString::number(ui->ImageThumbList->count())); // probably not necessary for you
QString strTooltip = "a tooltip"
pItem->setToolTip(strTooltip);
ui->ImageThumbList->addItem(pItem);