【问题标题】:Weird resizing behaviour of QScrollArea with QHBoxLayout inside内部带有 QHBoxLayout 的 QScrollArea 的奇怪调整大小行为
【发布时间】:2017-07-20 14:25:06
【问题描述】:

如何重现:创建一个新的 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 小部件的最小高度,这在实践中几乎没有用。

【问题讨论】:

  • 您希望小部件如何显示?
  • @eyllanesc 按钮上方和下方没有空白区域。我不明白它是从哪里来的——起初我以为这些是一些可配置的边距,但不是。
  • 如果MainWindow的高度超过了按钮的高度加上QScrollArea的滑块的高度,应该怎么看?
  • MainWindow 可调整大小 - 请注意其右下角的句柄。问题是为什么它拒绝垂直收缩超过这一点。
  • 我明白了,你想压缩 QMainWindow 的大小也让那些空格消失,对吗?

标签: c++ qt qscrollarea qlayout


【解决方案1】:

布局使用小部件的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。

截图:

【讨论】:

  • 感谢您为我指明了正确的方向。看一眼QAbstractScrollArea::minimumSizeHint() 的实现,展示了一个非常奇怪的算法,它要么比我更聪明,要么明显是错误的。鉴于它返回的明显错误的值,它可能是后者。我想我别无选择,只能在这里覆盖最小高度。
猜你喜欢
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
  • 2018-07-28
  • 2014-06-09
  • 1970-01-01
相关资源
最近更新 更多