c++ - 将元素添加到 QGroupBox 子时,QFrame 未调整大小
问题描述
我的图形元素层次结构如下:
QScrollArea > QFrame > [QLabel, QGroupBox, QGroupBox]
目前,它看起来像这样:
如果我添加其他元素,QFrame
它会变得更糟:
我怎么能告诉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);
}
解决方案
我重现了您的问题,我假设这是您正在寻找的解决方案。您需要添加
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);
}
推荐阅读
- javascript - 在 Cloudflare worker 上使用 HTMLRewriter 设置属性
- database - Flyway 最佳实践:一个大型迁移脚本与许多增量脚本
- python - 表单对象在 Django 中不可迭代
- sql - 当我对 ORACLE 中的列执行 Max 时,如何使用来自另一个表的 Join?
- sql - SELECT列表表达式引用了既不分组也不聚合的列xxx,为什么需要使用子查询?
- java - 在 Docker 上运行时,使用 Opensagres 和 Apache poi 将 DOCX 转换为 PDF 会导致符号丢失
- java - AssertJ Swing 的设置 - 测试 GUI
- node.js - 增加排序键 dynamoDB node.js
- import - OroCRM:导入 csv 联系人功能不起作用。我如何解决它?
- oracle - 是否可以将 Watson Assistant 与 Oracle 数据库链接?