动态删除QLabel 我正在努力创建一个QT和C++的GUI。

动态删除QLabel 我正在努力创建一个QT和C++的GUI。,c++,qt,C++,Qt,我动态地创建了一些伙伴(QLabel+QSpinBox),以刷新我的程序在上千轮循环中出错的数量 我的创建代码: if((num_fotos % 1000) == 0){ if(num_layouts < NUM_FAIL_COUNT){ for(int i = 0; i < (buffer->length()-1); i++){ sum_100_fallos += int(buffer->at(i)); }

我动态地创建了一些伙伴(
QLabel
+
QSpinBox
),以刷新我的程序在上千轮循环中出错的数量

我的创建代码:

if((num_fotos % 1000) == 0){
    if(num_layouts < NUM_FAIL_COUNT){
        for(int i = 0; i < (buffer->length()-1); i++){
            sum_100_fallos += int(buffer->at(i));
        }
        QLabel * label_1000 = new QLabel();
        label_1000->setText("Fallos 1000_" + QString::number(num_fotos/1000) + ": ");
        label_1000->setMinimumHeight(24);
        QSpinBox * spinBox_1000 = new QSpinBox();
        //newElements->append(label_1000);
        spinBox_1000->setReadOnly(true);
        spinBox_1000->setRange(0, 1000);
        spinBox_1000->setMinimumHeight(24);
        new_layouts[num_layouts] = new QHBoxLayout;
        //newElements->append(spinBox_1000);
        new_layouts[num_layouts]->addWidget(label_1000);
        new_layouts[num_layouts]->addWidget(spinBox_1000);
        spinBox_1000->setValue(num_fallos_1000);
        num_fallos_1000 = 0;

        ui->verticalLayout_5->addLayout(new_layouts[num_layouts]);
        num_layouts++;
    }else{
        aux = num_layouts % NUM_FAIL_COUNT;
        delete new_layouts[aux];
        for(int i = 0; i < (buffer->length()-1); i++){
            sum_100_fallos += int(buffer->at(i));
        }
        QLabel * label_1000 = new QLabel();
        label_1000->setText("Fallos 1000_" + QString::number(num_fotos/1000) + ": ");
        label_1000->setMinimumHeight(24);
        QSpinBox * spinBox_1000 = new QSpinBox();
        //newElements->append(label_1000);
        spinBox_1000->setReadOnly(true);
        spinBox_1000->setRange(0, 1000);
        spinBox_1000->setMinimumHeight(24);
        new_layouts[aux] = new QHBoxLayout;
        //newElements->append(spinBox_1000);
        new_layouts[aux]->addWidget(label_1000);
        new_layouts[aux]->addWidget(spinBox_1000);
        spinBox_1000->setValue(num_fallos_1000);
        num_fallos_1000 = 0;

        ui->verticalLayout_5->addLayout(new_layouts[aux]);
        num_layouts++;
    }   
}
if((num\u fotos%1000)==0){
if(num_布局长度()-1);i++){
sum_100_fallos+=int(缓冲区->at(i));
}
QLabel*label_1000=新的QLabel();
label_1000->setText(“Fallos 1000”+QString::number(num_fotos/1000)+“:”;
标签_1000->设置最小高度(24);
QSpinBox*spinBox_1000=新QSpinBox();
//新元素->附加(标签_1000);
spinBox_1000->setReadOnly(真);
spinBox_1000->setRange(0,1000);
spinBox_1000->设置最小高度(24);
新的布局[num_layouts]=新的QHBoxLayout;
//新元素->附加(spinBox\u 1000);
新的_布局[num_布局]->addWidget(标签_1000);
新的布局[num\u layouts]->addWidget(spinBox\u 1000);
spinBox_1000->setValue(num_fallos_1000);
num_fallos_1000=0;
ui->verticalLayout_5->addLayout(新建布局[num_布局]);
num_布局++;
}否则{
aux=num\u布局%num\u失败\u计数;
删除新的_布局[aux];
对于(int i=0;i<(缓冲区->长度()-1);i++){
sum_100_fallos+=int(缓冲区->at(i));
}
QLabel*label_1000=新的QLabel();
label_1000->setText(“Fallos 1000”+QString::number(num_fotos/1000)+“:”;
标签_1000->设置最小高度(24);
QSpinBox*spinBox_1000=新QSpinBox();
//新元素->附加(标签_1000);
spinBox_1000->setReadOnly(真);
spinBox_1000->setRange(0,1000);
spinBox_1000->设置最小高度(24);
新的_布局[aux]=新的QHBoxLayout;
//新元素->附加(spinBox\u 1000);
新的_布局[aux]->addWidget(标签_1000);
新的_布局[aux]->addWidget(spinBox_1000);
spinBox_1000->setValue(num_fallos_1000);
num_fallos_1000=0;
ui->verticalLayout_5->addLayout(新的布局[aux]);
num_布局++;
}   
}
NUM\u FAIL\u COUNT
是同时显示的(
qlabel
+
QLineEdit
)数。 如果少于
NUM\u FAIL\u COUNT
,我将创建新布局并将其添加到视图中

如您所见,这是我动态创建的。 但是,如果有多个
NUM\u FAIL\u COUNT
,我想删除整个第一个布局及其子布局,以便在底部添加新布局。 发生的情况是,第一个布局被删除,而不是其子布局,与
QLabel
+
QLineEdit
重叠

我曾尝试通过
children()
调用,使用指针
deleteLater()
访问它,并尝试在删除布局之前清除布局

我怎么想的不对?
感谢您的回答。

您可以创建QList并存储指向已创建QWidgets的指针。下面是一个简单的例子:

mainwindow.hpp:

#ifndef MAINWINDOW_HPP
#define MAINWINDOW_HPP

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);

private:
    QList<QWidget*> widgets;
};

#endif // MAINWINDOW_HPP
\ifndef主窗口\u水电站
#定义主窗口\u水电站
#包括
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
私人:
QList小部件;
};
#endif//main window\u水电站
mainwindow.cpp:

#include "mainwindow.hpp"
#include <QLabel>
#include <QVBoxLayout>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    QVBoxLayout *mainLayout = new QVBoxLayout;
    QVBoxLayout *widgetLayout = new QVBoxLayout;
    QHBoxLayout *buttonLayout = new QHBoxLayout;
    QPushButton *add = new QPushButton("Add", this);
    QPushButton *remove = new QPushButton("Remove", this);
    buttonLayout->addWidget(add);
    buttonLayout->addWidget(remove);

    mainLayout->addLayout(widgetLayout);
    mainLayout->addLayout(buttonLayout);

    setCentralWidget(new QWidget(this));
    centralWidget()->setLayout(mainLayout);

    connect(remove, &QPushButton::clicked, [=](){
        if (widgets.size() > 0) {
            QWidget *widget = widgets.takeLast();
            widgetLayout->removeWidget(widget);

            widget->deleteLater();
        }
    });
    connect(add, &QPushButton::clicked, [=](){
        QWidget *widget = new QLabel("Test " + QString::number(widgets.size()), this);
        widgetLayout->addWidget(widget);
        widgets.append(widget);
    });
}
#包括“mainwindow.hpp”
#包括
#包括
#包括
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父窗口)
{
QVBoxLayout*mainLayout=新的QVBoxLayout;
QVBoxLayout*widgetLayout=新的QVBoxLayout;
QHBoxLayout*按钮布局=新的QHBoxLayout;
QPushButton*add=新的QPushButton(“添加”,此项);
QPushButton*remove=新的QPushButton(“remove”,这是);
按钮布局->添加小部件(添加);
按钮布局->添加小部件(删除);
mainLayout->addLayout(widgetLayout);
主布局->添加布局(按钮布局);
setCentralWidget(新的QWidget(this));
centralWidget()->setLayout(mainLayout);
连接(删除,&QPushButton::单击,[=](){
if(widgets.size()>0){
QWidget*widget=widgets.takeLast();
widgetLayout->removeWidget(小部件);
widget->deleteLater();
}
});
连接(添加,&QPushButton::单击,[=](){
QWidget*widget=newqlabel(“Test”+QString::number(widgets.size()),this);
widgetLayout->addWidget(小部件);
widgets.append(widget);
});
}

致以最诚挚的问候

您可以创建QList并存储指向已创建QWidget的指针。下面是一个简单的例子:

mainwindow.hpp:

#ifndef MAINWINDOW_HPP
#define MAINWINDOW_HPP

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);

private:
    QList<QWidget*> widgets;
};

#endif // MAINWINDOW_HPP
\ifndef主窗口\u水电站
#定义主窗口\u水电站
#包括
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
私人:
QList小部件;
};
#endif//main window\u水电站
mainwindow.cpp:

#include "mainwindow.hpp"
#include <QLabel>
#include <QVBoxLayout>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    QVBoxLayout *mainLayout = new QVBoxLayout;
    QVBoxLayout *widgetLayout = new QVBoxLayout;
    QHBoxLayout *buttonLayout = new QHBoxLayout;
    QPushButton *add = new QPushButton("Add", this);
    QPushButton *remove = new QPushButton("Remove", this);
    buttonLayout->addWidget(add);
    buttonLayout->addWidget(remove);

    mainLayout->addLayout(widgetLayout);
    mainLayout->addLayout(buttonLayout);

    setCentralWidget(new QWidget(this));
    centralWidget()->setLayout(mainLayout);

    connect(remove, &QPushButton::clicked, [=](){
        if (widgets.size() > 0) {
            QWidget *widget = widgets.takeLast();
            widgetLayout->removeWidget(widget);

            widget->deleteLater();
        }
    });
    connect(add, &QPushButton::clicked, [=](){
        QWidget *widget = new QLabel("Test " + QString::number(widgets.size()), this);
        widgetLayout->addWidget(widget);
        widgets.append(widget);
    });
}
#包括“mainwindow.hpp”
#包括
#包括
#包括
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父窗口)
{
QVBoxLayout*mainLayout=新的QVBoxLayout;
QVBoxLayout*widgetLayout=新的QVBoxLayout;
QHBoxLayout*按钮布局=新的QHBoxLayout;
QPushButton*add=新的QPushButton(“添加”,此项);
QPushButton*remove=新的QPushButton(“remove”,这是);
按钮布局->添加小部件(添加);
按钮布局->添加小部件(删除);
mainLayout->addLayout(widgetLayout);
主布局->添加布局(按钮布局);
setCentralWidget(新的QWidget(this));
centralWidget()->setLayout(mainLayout);
连接(删除,&QPushButton::单击,[=](){
if(widgets.size()>0){
QWidget*widget=widgets.takeLast();
widgetLayout->removeWidget(小部件);
widget->deleteLater();
}
});
连接(添加,&QPushButton::单击,[=](){
QWidget*widget=newqlabel(“Test”+QString::number(widgets.size()),this);
widgetLayout->addWidget(小部件);
widgets.append(widget);