动态创建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);
    }
}
相关推荐
java_logo1 小时前
Apache Doris Docker 部署指南:实时分析数据库实战
数据库·docker·apache·doris·apache doris·轩辕镜像·docker部署doris
广州灵眸科技有限公司9 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
憧憬成为web高手11 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学12 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh14 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
z1234567898615 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD15 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
java_logo15 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程
TlSfoward16 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记16 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘