前言
很多时候我们可以在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