动态创建combobox

cpp 复制代码
#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();
    });
}
cpp 复制代码
#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);
    }
}
相关推荐
摇滚侠2 小时前
Spring 零基础入门到进阶 基于 XML 的声明式事务 71
xml·数据库·spring
xiaoshuaishuai83 小时前
C# 逆向分析Privazer
数据库·microsoft·c#
北有树3 小时前
【无标题】
数据库
霸道流氓气质3 小时前
MySQL 大数据量场景下的表结构与索引设计指南
数据库·mysql
AOwhisky3 小时前
Redis 学习笔记(第二期):核心数据类型与消息队列实战
运维·数据库·redis·笔记·学习·云计算
lsyeei3 小时前
MySQL常用索引
数据库·mysql
雨辰AI3 小时前
生产级实战|SpringBoot3 + 达梦DM9 数据库权限收敛与三权分立完整落地方案
数据库·mysql·oracle·政务
Gong-Yu3 小时前
MySQL数据库运维——性能优化进阶1️⃣
运维·数据库·mysql·性能优化
Harvy_没救了3 小时前
【云计算】华为公有云构建高可用Redis集群
数据库·redis·云计算