动态创建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);
    }
}
相关推荐
byte轻骑兵1 小时前
时序数据库选型全指南|大数据工业场景Apache IoTDB落地实操
大数据·数据库·人工智能·apache iotdb
Sirens.1 小时前
MySQL数据库:JDBC编程
数据库·mysql
蓝速科技2 小时前
会议室门牌签到功能选型与落地指南丨蓝速科技
大数据·运维·数据库·人工智能·科技
Hrain-AI11 小时前
多 Agent 并行不打架:worktree 隔离与反馈回流落地(附脚本)
网络·数据库·人工智能·架构
净水深流11 小时前
中央厨房冷链技术实践:多温区改造、WMS落地与IoT温控架构
大数据·数据库·人工智能·冷库冷链
l1t12 小时前
测试DuckDB 2.1的match_recognize模式匹配语句
数据库·duckdb
IpdataCloud13 小时前
AI智能体调用工具怎么核验来源IP?归属地、网络类型与代理风险识别(含Python代码)
数据库·python·tcp/ip
曹牧13 小时前
Java:SQL 注入漏洞
数据库
程序员JerrySUN13 小时前
Jetson Edge AI 实战01:Nano、Xavier、Orin 怎么选?Jetson 硬件选型详解【视频讲解】
java·数据库·redis·安全·mybatis
oradh14 小时前
Oracle Undo问题总结(ORA-600 [4xxx] 系列错误)
数据库·oracle