在花费数小时寻找解决方案之后,构建一个动态添加和删除按钮的网格,它不会在转到下一页时删除以前的按钮。
我在这里进行了搜索,并找到了“一些”解决方案,但它们不起作用。
这是我的代码。
这是用 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);
这是填充网格的方法,然后添加到 thw 小部件的布局中
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;
}
}
但这不起作用,当我单击下一步(删除所有以前的按钮并从向量中添加新按钮)时,如果我要删除它们并删除布局,它将在新按钮不知道为什么的情况下将它们放在并添加一个新的。
对此有什么想法吗?