QFrame не изменяет размер при добавлении элемента в дочерний элемент QGroupBox - PullRequest
0 голосов
/ 05 августа 2020

Моя иерархия графических элементов следующая:

QScrollArea > QFrame > [QLabel, QGroupBox, QGroupBox]

В настоящее время это выглядит так:

current situation

and if I add other elements to the QFrame it gets even worse:

худшая ситуация

Как я могу указать QFrame изменить размер вместо сжатия детей?

Весь код выглядит так:

#ifndef GESTIONALE_H
#define GESTIONALE_H

#include <QWidget>

#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QPushButton>
#include <QLabel>
#include <QCheckBox>
#include <QMenuBar>
#include <QMenu>
#include <QTableView>
#include <QGroupBox>
#include <QComboBox>
#include <QFile>
#include <QScrollArea>
#include "gestionalebutton.h"

class Gestionale : public QWidget{
    Q_OBJECT

public:
    Gestionale(QWidget *parent = nullptr);
    ~Gestionale();


private:
    QHBoxLayout* mainLayout;
    //Layout Sinistro con tutti i suoi componenti
    QVBoxLayout* layoutGestione;
    QGroupBox* Visualizzare;
    QVBoxLayout* LayoutVisualizzare;
    //Layout Destro con tutti i suoi componenti
    QHBoxLayout* Left;
    QVBoxLayout* layoutVisualizza;


    void addBoxDestro();
    void addBoxSinistro();
    void addComboBox();
    void addFirstBox();
    void addBoxPersona();
    void addBoxLavoro();
    void addAzioni();

    void setStyle();
};

#endif // GESTIONALE_H

#include "gestionale.h"
#include "ui_gestionale.h"


Gestionale::Gestionale(QWidget *parent): QWidget(parent){
    mainLayout = new QHBoxLayout(this);
    this->setMinimumSize(1280, 800);
    mainLayout->setAlignment(Qt::AlignTop);
    mainLayout->setContentsMargins(0,0,0,0);
    addBoxSinistro();
    addBoxDestro();
    setStyle();
    setLayout(mainLayout);
}

Gestionale::~Gestionale(){};


void Gestionale::addBoxSinistro()
{
    auto scroll = new QScrollArea(this);
    scroll->setObjectName("scroll-left");
    scroll->setFixedWidth(270);
    scroll->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
    scroll->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );



    auto* Gestione = new QFrame(scroll);
    Gestione->setFixedWidth(250);
    layoutGestione = new QVBoxLayout(Gestione);
    layoutGestione->setAlignment(Qt::AlignTop);
    addComboBox();
    addFirstBox();
    scroll->setWidget(Gestione);
    scroll->setAlignment(Qt::AlignHCenter);
    mainLayout->addWidget(scroll);
}

void Gestionale::addComboBox()
{
    QLabel* Visualizza = new QLabel("Metriche visualizzazione:", this, Qt::WindowFlags());
    Visualizza->setObjectName("title-left");
    layoutGestione->addWidget(Visualizza);
    QComboBox* Dipendenti = new QComboBox(this);
    Dipendenti->addItems({
        "Tutti",
        "Manutentore",
        "Hardware",
        "Software",
        "BackDev",
        "FrontDev",
        "FullStack",
        "BDDeveloper",
        "GUIDeveloper",
        "ITSecurityDev",
        "Tecnico"
    });
    layoutGestione->addWidget(Dipendenti);
}

void Gestionale::addFirstBox()
{
    Visualizzare = new QGroupBox(this);
    Visualizzare->setTitle("Cosa Visualizzare");
    LayoutVisualizzare = new QVBoxLayout(Visualizzare);
    addBoxPersona();
    addBoxLavoro();
    layoutGestione->addWidget(Visualizzare);
}

void Gestionale::addBoxPersona()
{
    QGroupBox* DatiPersona = new QGroupBox(this);
    DatiPersona->setObjectName("DatiPersona");
    DatiPersona->setTitle("Dati della persona");
    QVBoxLayout* layoutDatiPersona = new QVBoxLayout(DatiPersona);
    QCheckBox* Cognome = new QCheckBox("Cognome",this);
    layoutDatiPersona->addWidget(Cognome);
    QCheckBox* Nome = new QCheckBox("Nome",this);
    layoutDatiPersona->addWidget(Nome);
    QCheckBox* Sesso = new QCheckBox("Sesso",this);
    layoutDatiPersona->addWidget(Sesso);
    QCheckBox* Eta = new QCheckBox("Eta'",this);
    layoutDatiPersona->addWidget(Eta);
    LayoutVisualizzare->addWidget(DatiPersona);
}

void Gestionale::addBoxLavoro()
{
    QGroupBox* DatiDip = new QGroupBox(this);
    DatiDip->setTitle("Dati relativi al lavoro");
    QVBoxLayout* layoutDatiDip = new QVBoxLayout(DatiDip);
    QCheckBox* DataA = new QCheckBox("Data assunzione",this);
    layoutDatiDip->addWidget(DataA);
    QCheckBox* DataFineContratto = new QCheckBox("Data fine contratto",this);
    layoutDatiDip->addWidget(DataFineContratto);
    QCheckBox* StipendioBase = new QCheckBox("Stipendio Base Mensile",this);
    layoutDatiDip->addWidget(StipendioBase);
    QCheckBox* OreLavoro= new QCheckBox("Ore di lavoro settimanale",this);
    layoutDatiDip->addWidget(OreLavoro);
    LayoutVisualizzare->addWidget(DatiDip);
}

void Gestionale::addBoxDestro()
{
    QGroupBox* Visualizza = new QGroupBox(this);
    Visualizza->setTitle("Visualizzazione Dipendenti");
    layoutVisualizza = new QVBoxLayout(Visualizza);
    QTableView* Tabella = new QTableView();
    layoutVisualizza->addWidget(Tabella);
    addAzioni();
    addAzioni();
    mainLayout->addWidget(Visualizza);
}

void Gestionale::addAzioni()
{

    QGroupBox* Azioni = new QGroupBox(this);
    Azioni->setTitle("Azioni sui dipendenti");
    Azioni->setObjectName("azioni-left");
    QVBoxLayout* layoutAzioni = new QVBoxLayout(Azioni);
    QPushButton* Inserisci = new QPushButton("Inserisci",Azioni);
    layoutAzioni->addWidget(Inserisci);
    QPushButton* Modifica = new QPushButton("Modifica",Azioni);
    layoutAzioni->addWidget(Modifica);
    QPushButton* Elimina = new QPushButton("Elimina",Azioni);
    layoutAzioni->addWidget(Elimina);
    layoutGestione->addWidget(Azioni);
}

void Gestionale::setStyle()
{
    QFile file(":/resources/style.css");
    file.open(QFile::ReadOnly);
    QString styleSheet = QLatin1String(file.readAll());
    setStyleSheet(styleSheet);
}

И стиль выглядит следующим образом:

/*QGroupBox#DatiPersona{background-color:rgb(58,53,43);}*/
#scroll-left, #scroll-left *{
    background-color:#1565C0;
    color: white;
    font-family: helvetica;
}
#scroll-left #title-left{
    font-size: 18px;
    font-weight: bold;
}
 #scroll-left QComboBox, #scroll-left QComboBox *{
    background-color:white;
    color:black;
}

#scroll-left QCheckBox::indicator{
    background-color: white;
    color:black;
    border-radius: 6px;
    border: 3px solid white;
}
#scroll-left QCheckBox::indicator:checked {
    background-color: #aaf255 !important;
}
#scroll-left QCheckBox::indicator:unchecked {
    background-color: white !important;
}

#scroll-left QGroupBox{
    border:1px solid white;
    border-radius:5px;
    margin-top: 1ex;
    padding:10px 5px;
    font-weight: bold;
    padding-bottom:0px;
    padding-bottom:0px;
}

#scroll-left QGroupBox::title{
    subcontrol-origin: margin;
    subcontrol-position:top center;
    padding:0 3px;
}

#scroll-left QGroupBox QGroupBox{
    border:2px solid white;
    border-width: 0 0 0 2px;
    border-radius:0px;
    margin-top: 1ex;
    margin-bottom:10px;
    padding-bottom:0px;
    font-weight: normal;
}

#scroll-left QGroupBox QGroupBox::title{
    subcontrol-origin: margin;
    subcontrol-position:top left;
    padding:0 3px;
}

#scroll-left QPushButton {
    color:black;
    padding: 5px;
    border-radius: 12px;
    background-color: white;
}
#scroll-left QPushButton:pressed {
    background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
                                      stop: 0 #dadbde, stop: 1 #f6f7fa);
}

1 Ответ

1 голос
/ 05 августа 2020

Я воспроизвел вашу проблему и полагаю, что это именно то исправление, которое вы ищете. Вам нужно добавить

scroll->setWidgetResizable(true);

в свою addBoxSinistro функцию:

void Gestionale::addBoxSinistro()
{
    auto scroll = new QScrollArea(this);
    scroll->setObjectName("scroll-left");
    scroll->setFixedWidth(270);
    scroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    scroll->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    scroll->setWidgetResizable(true);


    auto* Gestione = new QFrame(scroll);
    Gestione->setFixedWidth(250);
    layoutGestione = new QVBoxLayout(Gestione);
    layoutGestione->setAlignment(Qt::AlignTop);
    addComboBox();
    addFirstBox();
    scroll->setWidget(Gestione);
    scroll->setAlignment(Qt::AlignHCenter);
    mainLayout->addWidget(scroll);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...