带有 QHBoxLayout 的 QScrollArea 的奇怪调整行为
Weird resizing behaviour of QScrollArea with QHBoxLayout inside
如何重现:创建一个新的 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;
}
构建项目后,生成的应用程序的 window 将拒绝垂直收缩到此以下:
我的问题:如何去掉按钮上方和下方的空白space?我尝试操纵尺寸提示、尺寸策略和其他所有远程相关的东西,但没有令人满意的结果。影响它的唯一方法似乎是硬编码 QScrollArea
小部件最小高度,这在实践中几乎没有用。
布局使用小部件的 minimumSizeHint()
作为最小尺寸,对于 QScrollArea,这是 QSize(70, 70)
。
这就是您看到的问题的原因,在按钮 minimumSizeHint()
的情况下是 QSize(24, 23)
。
正如您在 post 中所说,纠正上述问题的一种方法是设置最小尺寸,例如我建议使用 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。
截图:
如何重现:创建一个新的 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;
}
构建项目后,生成的应用程序的 window 将拒绝垂直收缩到此以下:
我的问题:如何去掉按钮上方和下方的空白space?我尝试操纵尺寸提示、尺寸策略和其他所有远程相关的东西,但没有令人满意的结果。影响它的唯一方法似乎是硬编码 QScrollArea
小部件最小高度,这在实践中几乎没有用。
布局使用小部件的 minimumSizeHint()
作为最小尺寸,对于 QScrollArea,这是 QSize(70, 70)
。
这就是您看到的问题的原因,在按钮 minimumSizeHint()
的情况下是 QSize(24, 23)
。
正如您在 post 中所说,纠正上述问题的一种方法是设置最小尺寸,例如我建议使用 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。
截图: