首页 文章

当更多小部件放在里面时,我如何调整QScrollArea的内容

提问于
浏览
19

我有一个QScrollArea Widget,它从空开始;

empty QScrollArea

它有一个垂直布局,一个QGridLayout和一个垂直间隔,以保持在顶部,并防止它在整个滚动区域上伸展;

QScrollArea in Qt Designer

在程序的其他地方,有一个QTextEdit,当它被改变时,其内容扫描“种类”元素,然后它们被添加到QGridLayout . 已经除去的任何物种元素也被除去 . 这个位有效;

QScrollArea with strange scroll bar

我一直打开垂直滚动条,所以当它出现时它不会位于那里的其他东西之上 . 请注意,尽管不需要,滚动条已经大于滚动框 .

这就是问题 . 滚动区域似乎是预设的,我无法更改它 . 如果我向QGridLayout添加更多行,则滚动区域的大小不会增加 .

相反,它保持相同的大小,并挤压QGridLayout,使它看起来很丑陋(起初);

Squashed QGridLayout

然后添加更多它变得无法使用;

unusable line edits

请注意,滚动条仍然与之前的图像大小相同 . 前两个图像来自Qt Designer,后续的3个来自程序运行 .

如果我调整窗口大小以使QScrollArea增长,那么我看到:

dumb too small layout

指示滚动区域内的某些布局未正确调整大小 .

我的问题是; what do I need to do to make the scrollable area of the widget resize dynamically as I add and remove from the QGridLayout?

3 回答

  • -1

    documentation提供了答案:

    widgetResizable:bool此属性保存滚动区域是否应调整视图窗口小部件的大小 . 如果此属性设置为false(默认值),则滚动区域将遵循其窗口小部件的大小 .

    将其设置为true .

  • 24

    如果你're coming here from Google and not having luck with the accepted answer, that'因为你错过了其他的秘密调用: 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_()
    
  • 16

    为什么不为行使用QListView,它会为您管理所有问题?只需确保在添加它之后单击类(设计器的右上方窗口)并指定布局或它不会正确扩展 .

    我在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);
    

相关问题