在花了一个小时搜索解决方案后,要构建一个动态添加和删除按钮的网格,在转到下一页时不会删除以前的按钮。
我在这里搜索了一下,找到了"一些"解决方案,但它们不起作用。
这是我的密码。
这是用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;
}
}
但这不起作用,当我单击"下一步"(删除所有以前的按钮并从矢量中添加新按钮)时,它会将它们放在新按钮的后面。如果我删除它们并删除布局并添加新按钮,我不知道为什么。
有什么想法吗?
您从布局中删除了项目,但没有删除按钮。如果你想完全去掉这些按钮,你也必须删除它们。或者,如果你不想删除它们,你可以隐藏它们(你可以这样做,如果你这样做,从布局中删除它们毫无意义,是吗?)。否则,它们将在其父窗口小部件中可见。您可以使用QLayoutItem::widget
来获取小部件。
也许对您来说,更好的解决方案是使用QStackedLayout
。以下是文档中的一个示例:
QWidget *firstPageWidget = new QWidget;
QWidget *secondPageWidget = new QWidget;
QWidget *thirdPageWidget = new QWidget;
QStackedLayout *stackedLayout = new QStackedLayout;
stackedLayout->addWidget(firstPageWidget);
stackedLayout->addWidget(secondPageWidget);
stackedLayout->addWidget(thirdPageWidget);
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addLayout(stackedLayout);
setLayout(mainLayout);
并使用QComboBox
:更改stackedlayout
的页面
QComboBox *pageComboBox = new QComboBox;
pageComboBox->addItem(tr("Page 1"));
pageComboBox->addItem(tr("Page 2"));
pageComboBox->addItem(tr("Page 3"));
connect(pageComboBox, SIGNAL(activated(int)),
stackedLayout, SLOT(setCurrentIndex(int)));
如果你真的需要从布局中删除按钮,这里有一个小例子:
centralWidget()->setLayout(new QVBoxLayout);
for(int i = 0; i < 10; i++)
{
centralWidget()->layout()->addWidget(new QLabel(QString("LABEL%1").arg(i)));
}
QLayoutItem *item;
while((item= centralWidget()->layout()->takeAt(0)) != 0)
{
// item->widget()->setHidden(true);
item->widget()->setParent(0); // you can use this or setHidden... up to you
delete item;
}