после часового поиска решения, чтобы построить сетку, которая динамически добавляет и удаляет кнопки, она не удаляет предыдущие при переходе на следующую страницу.
У меня есть поиск здесь, и я нашел «некоторые» решения, но они не работают.
Это мой код.
Это код для заполнения вектора myQpushButtons (добавлено 3 метода, которые мне нужны для кнопки)
QString famId = ui->comboBox->itemData(index).toString();
if (vectButtons.size() > 0)
{
vectButtons.clear();
}
int totalPerPage = gridRow * gridColl;
int countPage = 0;
int totalButtons = 0;
double counterProd = 1.0;
qDebug() << idbConnect.get_Familia(famId)->get_FamProd()->count();
for (pair<QString, Produto> prod : idbConnect.get_Familia(famId)->get_FamProd()->toStdMap())
{
if (counterProd == totalPerPage)
{
countPage++;
counterProd = 2.0;
buttons = new myQPushButton();
buttons->setText("Proximo");
buttons->set_Tipo(1);
buttons->set_Pagina((totalPerPage * countPage));
connect(buttons,SIGNAL(released()),this,SLOT(handleButton()));
vectButtons.push_back(buttons);
// #####################################################
buttons = new myQPushButton();
buttons->setText("Anterior");
buttons->set_Tipo(1);
buttons->set_Pagina((totalPerPage * (countPage - 1)));
connect(buttons,SIGNAL(released()),this,SLOT(handleButton()));
vectButtons.push_back(buttons);
// #####################################################
}
buttons = new myQPushButton();
buttons->setText(prod.second.get_Nome());
buttons->set_id_Prod(prod.first);
buttons->set_Tipo(0);
connect(buttons,SIGNAL(released()),this,SLOT(handleButton()));
vectButtons.push_back(buttons);
counterProd++;
totalButtons++;
}
fillGrid(0);
Это способ заполнить сетку, а затем добавить ее в макет виджета.
void MainWindow::fillGrid(int start)
{
grid = new QGridLayout;
for (int i = 0; i < gridRow; i++)
{
for (int y = 0; y < gridColl; y++)
{
grid->addWidget(vectButtons.at(start),i,y);
start++;
}
}
ui->widget->setLayout(grid);
ui->widget->repaint();
ui->widget->show();
}
И этот он вызывается, когда я нажимаю следующий или предыдущий, чтобы заполнить сетку новыми кнопками.
void MainWindow::replaceGrid(int start)
{
/*QLayout *temp;
temp = ui->widget->layout();
temp->deleteLater();
delete temp;
grid->deleteLater();
delete grid;
ui->widget->layout()->deleteLater();
delete ui->widget->layout();*/
removeLayout(ui->widget);
ui->widget->layout()->deleteLater();
delete ui->widget->layout();
grid = new QGridLayout;
for (int i = 0; i < gridRow; i++)
{
for (int y = 0; y < gridColl; y++)
{
if (start < vectButtons.size())
{
grid->addWidget(vectButtons.at(start),i,y);
start++;
}
}
}
ui->widget->setLayout(grid);
ui->widget->repaint();
ui->widget->show();
}
Этот вызывает другой метод, чтобы удалить все элементы из макета (в данном случае сетки) из виджета, так как я видел это решение на этом сайте, в котором говорится, что нам нужно удалить все элементы перед удалением макета виджета.
void MainWindow::removeLayout(QWidget* widget)
{
QLayout* layout = widget->layout();
if (layout != 0)
{
QLayoutItem *item;
while ((item = layout->takeAt(0)) != 0)
{
layout->removeItem(item);
}
delete layout;
}
}
Но это не работает, когда я нажимаю «Далее» (чтобы удалить все предыдущие кнопки и добавить новые из вектора), они будут включены, кроме новых кнопок, не знаю почему, если я удалю их и удалю макет и добавление нового.
Любые мысли по этому поводу?