Qt動態新增控制元件

和過去說再見發表於2020-11-17

前言

很多時候我們可以在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();

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

};

#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));
    }



    QList<QPushButton *> 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;
    }
}

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 --;
    }
}

連結

連結: Qt動態新增控制元件demo

相關文章