Qt动态添加控件

前言

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

效果

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


以下是添加20个控件组的效果,控件过多会自动添加滚动条
Qt动态添加控件_第1张图片
点击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,qt)