内部有QHBoxLayout的QScrollArea的奇怪的大小调整行为

时间:2017-07-20 05:07:32

标签: c++ qt qscrollarea qlayout

如何重现:创建一个新的Qt Widgets应用程序并将其mainwindow.cpp替换为以下内容:

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QHBoxLayout>
#include <QScrollArea>
#include <QToolButton>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QScrollArea *scrollArea = new QScrollArea;
    setCentralWidget(scrollArea);

    QFrame *scrollWidget = new QFrame;
    scrollArea->setWidget(scrollWidget);
    scrollArea->setWidgetResizable(true);

    QHBoxLayout *scrollLayout = new QHBoxLayout;
    scrollWidget->setLayout(scrollLayout);

    for(int i = 0; i < 10; ++i)
    {
        QToolButton *button = new QToolButton;
        button->setText(QString(20, QChar('a' + i)));
        scrollLayout->addWidget(button);
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}

构建项目后,生成的应用程序窗口将拒绝在此下方垂直缩小:

我的问题:如何摆脱按钮上方和下方的空白区域?我尝试操纵大小提示,大小政策以及其他所有与之相关的内容,但没有令人满意的结果。影响它的唯一方法似乎是硬编码QScrollArea小部件的最小高度,这在实践中几乎没用。

1 个答案:

答案 0 :(得分:0)

布局使用小部件的minimumSizeHint()作为最小尺寸,对于QScrollArea,这是QSize(70, 70)

如果按钮minimumSizeHint()QSize(24, 23),这就是您看到问题的原因。

正如你在帖子中所说,纠正上述方法的方法是设置最小尺寸,例如我建议使用48,因为它是按钮的最小尺寸加上QScrollBar:

QScrollArea *scrollArea = new QScrollArea;
setCentralWidget(scrollArea);
scrollArea->setMinimumHeight(48);
QFrame *scrollWidget = new QFrame;
scrollWidget->setStyleSheet("background-color: rgb(0, 85, 0);");
scrollWidget->setContentsMargins(0, 0, 0, 0);
scrollArea->setWidget(scrollWidget);
scrollArea->setWidgetResizable(true);
QHBoxLayout *scrollLayout = new QHBoxLayout;
scrollWidget->setLayout(scrollLayout);
scrollLayout->setContentsMargins(0, 0, 0, 0);

for(int i = 0; i < 10; ++i)
{
    QToolButton *button = new QToolButton;
    button->setText(QString(20, QChar('a' + i)));
    scrollLayout->addWidget(button);
}

注意:除了设置最小尺寸外,我建议将布局边距设置为0。

截图:

enter image description here