Qt Проблема с удалением widget из layout

105
10 ноября 2019, 09:00

Хочу загружать в layout только выбранный сформированный виджет из контейнера, который заполняется в конструкторе класса MainWindow.

Суть: из ListWidget выбирается элемент, индекс которого соответствует виджету(виджет содержит в себе группу элементов) и находится он в контейнере listGroupBox. Необходимо загружать один такой виджет в один момент времени, по клику элемента в ListWidget, а предыдущий элемент убирать из виджета, но не из контейнера listGroupBox, т.к при следующем клике на тот же элемент его снова нужно загружать.

Проблема: При каждом клике, элемент удаляется не только из ui->dynamicLayout, но и из контейнера listGroupBox, если его не удалять через delete layoutItem->widget(), то виджет рисуется поверх другого виджета, хотя его элемент удалён. Более подробно в комментариях кода в файле mainwindow.cpp, функция deleteWidgets().

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QGroupBox>
#include <QList>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void on_listWidget_currentRowChanged(int currentRow);
private:
    Ui::MainWindow *ui;
    void deleteWidgets();
    QList<QGroupBox*> listGroupBox;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "customwidgets.h"
#include <QVBoxLayout>
#include <QLineEdit>
#include <QSpinBox>
#include <QSpacerItem>
#include <QLayoutItem>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // Первый виджет
    CustomLineEdit *lineEdit1 = new CustomLineEdit;
    lineEdit1->setText("One");
    CustomSpinBox *spinBox1 = new CustomSpinBox;
    spinBox1->setValue(10);
    QSpacerItem *spacerItem1 = new QSpacerItem(1,1, QSizePolicy::Maximum, QSizePolicy::Expanding);
    QVBoxLayout *layout1 = new QVBoxLayout;
    layout1->addWidget(lineEdit1);
    layout1->addWidget(spinBox1);
    layout1->addSpacerItem(spacerItem1);
    QGroupBox *groupBox1 = new QGroupBox;
    groupBox1->setTitle("Widget 1");
    groupBox1->setLayout(layout1);
    // Второй виджет
    CustomLineEdit *lineEdit2 = new CustomLineEdit;
    lineEdit2->setText("Two");
    CustomSpinBox *spinBox2 = new CustomSpinBox;
    spinBox2->setValue(20);
    QSpacerItem *spacerItem2 = new QSpacerItem(1,1, QSizePolicy::Maximum, QSizePolicy::Expanding);
    QVBoxLayout *layout2 = new QVBoxLayout;
    layout2->addWidget(lineEdit2);
    layout2->addWidget(spinBox2);
    layout2->addSpacerItem(spacerItem2);
    QGroupBox *groupBox2 = new QGroupBox;
    groupBox2->setTitle("Widget 2");
    groupBox2->setLayout(layout2);
    // Третий виджет
    CustomLineEdit *lineEdit3 = new CustomLineEdit;
    lineEdit3->setText("Three");
    CustomSpinBox *spinBox3 = new CustomSpinBox;
    spinBox3->setValue(30);
    QSpacerItem *spacerItem3 = new QSpacerItem(1,1, QSizePolicy::Maximum, QSizePolicy::Expanding);
    QVBoxLayout *layout3 = new QVBoxLayout;
    layout3->addWidget(lineEdit3);
    layout3->addWidget(spinBox3);
    layout3->addSpacerItem(spacerItem3);
    QGroupBox *groupBox3 = new QGroupBox;
    groupBox3->setTitle("Widget 3");
    groupBox3->setLayout(layout3);
    // Добавление всех 3-х виджетов в контейнер
    listGroupBox.append(groupBox1);
    listGroupBox.append(groupBox2);
    listGroupBox.append(groupBox3);
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_listWidget_currentRowChanged(int currentRow)
{
    // Удаление всех виджетов(Layout) с формы
    deleteWidgets();
    // Загрузка только одного необходимого виджета в данный момент
    ui->dynamiclLayout->addWidget(listGroupBox.at(currentRow));
}
void MainWindow::deleteWidgets()
{
    QLayoutItem *layoutItem = NULL;
    while(layoutItem = ui->dynamiclLayout->takeAt(0))
    {
        // Обе строчки никак не решают мою проблему
        // ui->dynamiclLayout->removeWidget(layoutItem->widget());
        // ui->dynamiclLayout->removeItem(layoutItem);
        // Удаляет вообще весь виджет QGroupBox из listGroupBox, но с этой строчкой виджет корректно удаляется и
        // следующий выбранный виджет не рисуется поверх другого, но предыдущий уже не вернуть
        // delete layoutItem->widget();
        // delete layoutItem;
        ui->dynamiclLayout->update(); // Проблема в том, что виджеты продолжают рисоваться один на другой
    }
}
READ ALSO
Как рендерить подобие окон

Как рендерить подобие окон

В общем, я создаю игру, в которой у меня будет подобие операционной системыВ ней можно открывать, перетаскивать и выполнять прочие манипуляции...

121
Не выходит изменить размер квадратов в фиксированном поле, исходя из количества всех его клеток

Не выходит изменить размер квадратов в фиксированном поле, исходя из количества всех его клеток

У меня есть квадратное поле, которое я разбиваю на клетки, но размер этих клеток фиксирован и при небольшом количестве строк и столбцов на поле,...

105
Как встроить telegram в android приложение?

Как встроить telegram в android приложение?

Каким образом встроить чат-бота в Android приложениеПолучать ответы от бота в виде json-массива и выводить? или пытаться интегрировать его?

115