动态创建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);
    }
}
相关推荐
画中有画6 分钟前
时序数据库在物联网系统中的应用
数据库·物联网·时序数据库
Decay__6 小时前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
小徐不徐说11 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
论文复现现场11 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
Decay__12 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构
心梦缘-雪雁13 小时前
SQL Server 查询数据存在哪个表里
数据库
lusklusklusk14 小时前
Python 巡检脚本:进程运行状态、数据库写入时效检查及邮件通知与告警
数据库·python·oracle
GeW15 小时前
产业新优势基础软件的人才底盘,从Linux与数据库开始
linux·数据库
SelectDB15 小时前
Doris Arrow Flight SQL 高速读取协议实战:与 Snowflake 客户端取数链路对照
大数据·数据库·数据分析
曼岛_15 小时前
[图解密码学]第4章 古典密码
java·数据库·密码学