Хочу загружать в 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(); // Проблема в том, что виджеты продолжают рисоваться один на другой
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
В общем, я создаю игру, в которой у меня будет подобие операционной системыВ ней можно открывать, перетаскивать и выполнять прочие манипуляции...
У меня есть квадратное поле, которое я разбиваю на клетки, но размер этих клеток фиксирован и при небольшом количестве строк и столбцов на поле,...
Каким образом встроить чат-бота в Android приложениеПолучать ответы от бота в виде json-массива и выводить? или пытаться интегрировать его?