2017-07-20 51 views
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; 
} 

你建立项目后,所产生的应用程序的窗口将拒绝被垂直缩水下面这个样子:

我的问题:我如何摆脱上方和下方的按钮空闲空间的?我尝试操纵尺寸提示,尺寸政策以及其他所有与此相关的内容,但效果不理想。影响它的唯一方法似乎是硬编码最小高度,这在实践中几乎没有用。

+0

你想如何显示小部件? – eyllanesc

+0

@eyllanesc没有按钮上方和下方的空白空间。我不明白它来自哪里 - 起初我认为这些是可配置的边距,但不是。 – sigil

+0

如果MainWindow的高度超过按钮的高度加上QScrollArea的滑块的高度,应该如何看待它? – eyllanesc

回答

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

+0

感谢您让我朝着正确的方向前进。看一下'QAbstractScrollArea :: minimumSizeHint()'实现演示了一个非常奇怪的算法,它比我更聪明或者明显错误。鉴于它返回的公然错误的价值观,它可能是后者。猜测我没有其他选择,只能在这里覆盖最小高度。 – sigil