花了一个小时搜索解决方案后,构建一个动态添加和删除按钮的网格,当进入下一页时,它不会删除普通的网格。
我在这里搜索,发现"一些"解决方案,但他们没有工作。
这是我的代码。
这是使用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();
}
当我点击next或previus时会调用它,用新按钮填充网格。
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;
}
}
但是这不起作用,当我点击下一步(删除所有普通按钮并从矢量中添加新按钮)时,它会让它们显示新按钮不知道为什么,如果我&# 39; m删除它们并删除布局并添加新布局。
有什么想法吗?
答案 0 :(得分:1)
您从布局中删除了这些项目,但是您没有删除这些按钮。如果你想完全摆脱按钮,你也必须删除它们。或者你可以隐藏它们,如果你不想删除它们(你可以这样做,如果你这样做就没有意义从布局中删除它们,是吗?)。否则,它们将在其父窗口小部件中可见。您可以使用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);
并使用stackedlayout
更改QComboBox
的页面:
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;
}