c++ - QPushButton c++ 的动态 QGridLayout

标签 c++ qt qt5 qwidget qgridlayout

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

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

这是我的代码。

这是用 myQpushButtons 填充 vector 的代码(在按钮上添加了我需要的 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);

这是填充网格的方法,然后添加到widget的布局中

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;
}
}

但这不起作用,当我单击下一步(删除所有 previus 按钮并从 vector 中添加新按钮)时,它们将位于新按钮之外,不知道为什么,如果我要删除它们并且删除布局并添加新布局。

有什么想法吗?

最佳答案

您从布局中删除项目,但不删除按钮。如果你想完全摆脱按钮,你也必须删除它们。或者,如果您不想删除它们,您可以只隐藏它们(您可以这样做,如果您这样做,就没有必要将它们从布局中删除,是吗?)。否则它们将在其父窗口小部件内可见。您可以使用 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;
}

关于c++ - QPushButton c++ 的动态 QGridLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26016149/

相关文章:

c# - Windows 7 的登录屏幕更换

c++ - 进一步的右值引用和临时对象

c++ - 在 Qt 中为大量对象设置动画的最简单方法

c++ - QSharedPointer 在 emit 中被销毁

c++ - 在一个图层中添加2个CCScrollLayer时无法滚动

c++ - 使用 ffmpeg 将缓冲区中的 H.264 流写入可流式传输的 mp4

c++ - 为什么我的线程不能正常退出?

c++ - Qt 和 C-Lion 对 `WinMain@16' 的 undefined reference

c++ - 如何在 QT 中制作模态 QProgressDialog?

qt - 安装 QtLocation 时出错