#include "demo1.h"
#include <QDialog>
#include <QPushButton>
demo1::demo1(QWidget *parent) : QMainWindow(parent)
{
QPushButton *btn = new QPushButton("dialog",this);
CustomDialog *dialog = new CustomDialog(this);
connect(btn, &QPushButton::clicked,this,[=](){
dialog->exec();
});
}
#include "customdialog.h"
#include <QSpinBox>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QComboBox>
CustomDialog::CustomDialog(QWidget *parent, Qt::WindowFlags f)
: QDialog(parent, f) // 必须在初始化列表调用基类构造
{
// 1. 主布局:直接绑定到对话框 this,不要绕弯子
QVBoxLayout *vbox = new QVBoxLayout(this);
vbox->setContentsMargins(20, 20, 20, 20); // 设置边距,避免控件贴边
vbox->setSpacing(10); // 设置控件间距
// 2. 子 widget + 水平布局
QWidget *spanNumberWidget = new QWidget(this);
QHBoxLayout *hbox = new QHBoxLayout(spanNumberWidget);
hbox->setContentsMargins(0, 0, 0, 0); // 取消子布局边距,避免空白
hbox->setSpacing(10);
// 3. 创建控件并添加到水平布局
QLabel *label = new QLabel("图表数量");
QSpinBox *spin = new QSpinBox();
spin->setMaximum(6);
spin->setMinimum(0); // 建议加个最小值,避免用户选0
connect(spin, QOverload<int>::of(&QSpinBox::valueChanged),
[=](int i){
createCombox(i);
});
hbox->addWidget(label);
hbox->addWidget(spin);
// 4. 把子 widget 添加到主布局
vbox->addWidget(spanNumberWidget);
comboWidget = new QWidget(this);
vboxCombo = new QVBoxLayout();
comboWidget->setLayout(vboxCombo);
vbox->addWidget(comboWidget);
// 5. 设置对话框初始大小,确保能看到控件
this->resize(300, 120);
}
CustomDialog::~CustomDialog()
{
// Qt 布局会自动管理子控件,这里不用写任何代码
}
void CustomDialog::clearWidgetItem(QWidget *widget)
{
if(!widget) return;
QLayout *layout = widget->layout();
if(!layout) return;
QLayoutItem *item;
//item 不是空
while ((item = layout->takeAt(0)) != nullptr) {
if(item->widget()){//是Widget 删除
delete item->widget();
}
if(item->layout()){
clearLayout(item->layout());
}
delete item;
}
}
void CustomDialog::clearLayout(QLayout *layout)
{
if(!layout) return;
QLayoutItem *item;
while ((item = layout->takeAt(0)) != nullptr) {
if(item->widget()){
delete item->widget();
}
if(item->layout()){
clearLayout(item->layout());
}
delete item;
}
delete layout;
}
void CustomDialog::createCombox(int index)
{
clearWidgetItem(comboWidget);
for(int i = 0; i <=index; i++){
if(i == 0) continue;
QWidget *widget = new QWidget(this);
QHBoxLayout *hbox = new QHBoxLayout(this);
widget->setLayout(hbox);
QLabel *label = new QLabel(QString("图表%1").arg(i));
hbox->addWidget(label);
QComboBox *chartType = new QComboBox(this);
hbox->addWidget(chartType);
QComboBox *chartStyle = new QComboBox(this);
hbox->addWidget(chartStyle);
QComboBox *chartCpu = new QComboBox(this);
hbox->addWidget(chartCpu);
QComboBox *chartDocker = new QComboBox(this);
hbox->addWidget(chartDocker);
vboxCombo->addWidget(widget);
}
}