动态创建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);
    }
}
相关推荐
SelectDB1 小时前
Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑
大数据·数据库·python
jiayou641 天前
KingbaseES 表级与列级加密完全指南
数据库·后端
GBASE2 天前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
xiezhr2 天前
逛GitHub发现了一款免费的带AI功能的数据库管理工具
数据库·ai编程·dba
吃糖的小孩3 天前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
笃行3504 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3504 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3504 天前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
SelectDB5 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc