2017-07-20 6 views
0

Comment reproduire: Créer un nouveau Qt Widgets Application et remplacer son mainwindow.cpp ce qui suit:comportement Redimensionnement bizarre de QScrollArea avec QHBoxLayout intérieur

#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; 
} 

Après avoir créé le projet, la fenêtre de l'application résultant refusera d'être verticalement diminué en dessous de ce:

Ma question: Comment puis-je me débarrasser de l'espace vide au-dessus et en dessous des boutons? J'ai essayé de manipuler des conseils de taille, des politiques de taille, et tout le reste à distance pertinent, à aucun résultat satisfaisant. La seule façon de l'affecter semble être de coder en dur la hauteur minimale du widget QScrollArea, ce qui n'est guère utile en pratique.

+0

Comment voulez-vous que le widget soit affiché? – eyllanesc

+0

@eyllanesc Sans l'espace vide directement au-dessus et au-dessous des boutons. Je ne comprends pas d'où il vient - au début, je pensais qu'il s'agissait de marges configurables, mais non. – sigil

+0

Si la hauteur de MainWindow dépasse la hauteur du bouton plus la hauteur des curseurs de QScrollArea, comment doit-il être vu? – eyllanesc

Répondre

0

Les mises en page utilisent les widgets minimumSizeHint() comme taille minimale, dans le cas de QScrollArea, il s'agit de QSize(70, 70). Ceci est la cause du problème que vous voyez, dans le cas des boutons minimumSizeHint() est QSize(24, 23).

Et comme vous le dites dans votre message un moyen de corriger ce qui précède est de définir la taille minimale, par exemple, je recommande d'utiliser 48 comme il est la taille minimale du bouton plus la 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); 
} 

Remarque: En plus de définir la taille minimum que je recommande de placer les marges de mise en page à 0.

Screenshot:

enter image description here

+0

Merci de m'avoir placé dans la bonne direction. Un coup d'œil sur l'implémentation de 'QAbstractScrollArea :: minimumSizeHint()' a démontré un algorithme vraiment bizarre, soit plus intelligent que moi ou manifestement faux. Étant donné les valeurs manifestement erronées qu'il renvoie, c'est probablement le dernier. Je suppose que je n'ai pas d'autre choix que de passer outre la hauteur minimale ici. – sigil