Qt动态添加控件

本文介绍如何在Qt应用程序中动态地添加和删除控件,适用于控件数量未知的情况。通过创建一个控件组类,设置布局,并提供接口供外部调用,实现了动态添加和删除功能。示例展示了添加2个和20个控件组的效果,超过一定数量会自动显示滚动条。此外,还提供了删除所有控件组的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

很多时候我们可以在UI designer上拖拽控件进行编写UI,但有的时候需要的控件数量是未知的,这时候就需要在代码中进行编写了。

效果

以下是添加2个控件组的效果

在这里插入图片描述
以下是添加20个控件组的效果,控件过多会自动添加滚动条
在这里插入图片描述
点击delete按钮可以删除所有控件组,同样可以知道是哪个按钮点击的。

实现

代码参考了网上的,自己做了一些修改。
创建一个新的控件组类,布局,开出接口供外部调用

void setInfo(QString str_lb,QString str_btn);

void Mybtns::setInfo(QString str_lb, QString str_btn)
{
    ui->label->setText(str_lb);
    ui->pushButton->setObjectName(str_btn);
}

MAINWINDOW_H

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QHBoxLayout>
#include <QPushButton>
#include <QDebug>
#include "mybtns.h"
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void slotBtnClicked();
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::MainWindow *ui;
    QList<Mybtns*> list_widget;
    QList<QPushButton *> btn ;

};

#endif // MAINWINDOW_H

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    for (int i = 0; i < 20; i++)
    {
        Mybtns *widget = new Mybtns();
        list_widget.append(widget);
        ui->vlayout->addWidget(widget);
        widget->setInfo("张三(123456)","#" + QString::number(i));
    }



    btn = this->findChildren<QPushButton *>();
    foreach (QPushButton * b, btn) {
        connect(b, SIGNAL(clicked()), this, SLOT(slotBtnClicked()));
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::slotBtnClicked()
{
    QPushButton *btn = (QPushButton *)sender();
    QString objectName = btn->objectName();
    if(objectName.indexOf("#") !=  -1)
    {
        objectName.replace("#","");
        qDebug()<<objectName;
    }
    qDebug()<<objectName;
}

void MainWindow::on_pushButton_clicked()
{

    int num = ui->vlayout->count();             // 获取布局中的item的数量

    while( num){
        QWidget *widget = ui->vlayout->itemAt(num - 1)->widget();
        ui->vlayout->removeWidget(widget);
        delete widget;
        num --;
    }
}

void MainWindow::on_pushButton_2_clicked()
{
    int num = ui->vlayout->count();             // 获取布局中的item的数量

    while( num){
        QWidget *widget = ui->vlayout->itemAt(num - 1)->widget();
        ui->vlayout->removeWidget(widget);
        delete widget;
        num --;
    }
    
    for (int i = 0; i < 20; i++)
    {
        Mybtns *widget = new Mybtns();
        list_widget.append(widget);
        ui->vlayout->addWidget(widget);
        widget->setInfo("张三(123456)","#" + QString::number(i));
    }

//防止删除后无法找到btn控件
     btn = this->findChildren<QPushButton *>();
      foreach (QPushButton * b, btn) {
          connect(b, SIGNAL(clicked()), this, SLOT(slotBtnClicked()),Qt::UniqueConnection);
      }
}


链接

链接: Qt动态添加控件demo

Qt动态添加控件是一个常见的需求,特别是在需要根据运行时数据或用户操作来更新界面的情况下。实现该功能主要依赖于QWidget、布局管理器(如QVBoxLayout、QHBoxLayout)以及信号与槽机制。 ### 动态添加控件的基本步骤 1. **创建基础容器**:通常使用`QWidget`作为承载动态控件的容器。 2. **使用布局管理器**:通过`QVBoxLayout`或`QHBoxLayout`等布局类来组织和排列控件。 3. **动态创建并插入控件**:可以在程序运行过程中按需创建新的控件实例,并将其加入到已有的布局中。 4. **处理控件事件**:利用Qt的信号与槽机制为新添加控件绑定响应逻辑。 下面提供一个简单的示例代码,演示如何在一个按钮点击后向窗口中动态添加一个新的按钮控件: ```cpp #include <QApplication> #include <QWidget> #include <QPushButton> #include <QVBoxLayout> class DynamicWidget : public QWidget { Q_OBJECT public: DynamicWidget(QWidget *parent = nullptr) : QWidget(parent), layout(new QVBoxLayout(this)) { // 创建一个触发添加控件的按钮 QPushButton *addButton = new QPushButton("Add Button", this); connect(addButton, &QPushButton::clicked, this, &DynamicWidget::onAddButtonClicked); // 将触发按钮添加进布局 layout->addWidget(addButton); } private slots: void onAddButtonClicked() { // 每次点击时创建一个新的按钮并连接其点击事件 QPushButton *newButton = new QPushButton("New Button", this); connect(newButton, &QPushButton::clicked, [](){ qDebug() << "New button clicked!"; }); // 添加新按钮到布局中 layout->addWidget(newButton); } private: QVBoxLayout *layout; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); DynamicWidget dw; dw.show(); return app.exec(); } #include "main.moc" ``` 在这个例子中,每当用户点击“Add Button”时,都会在界面上新增一个名为“New Button”的按钮,并且这个新按钮还绑定了自己的点击事件处理器,当它被点击时会在控制台输出消息。 此外,如果想要创建更加复杂的自定义控件而不是简单地使用标准控件,则可以考虑从`QWidget`派生出自己的控件类并在其中实现特定的功能[^2]。这种方式允许开发者完全通过编程方式定义控件的行为和外观,而不依赖于UI设计工具拖拽控件的方式。 对于更高级的应用场景,比如需要对控件进行复杂的交互设计或者样式定制,还可以进一步探索Qt提供的丰富API和支持,包括但不限于动画效果、样式表(QSS)、绘图等特性。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值