Dynamic QGridLayout of QPushButton c++



在花了一个小时搜索解决方案后,要构建一个动态添加和删除按钮的网格,在转到下一页时不会删除以前的按钮。

我在这里搜索了一下,找到了"一些"解决方案,但它们不起作用。

这是我的密码。

这是用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;
}

相关内容

  • 没有找到相关文章

最新更新