2

我有一个QGridLayout添加自定义的地方QWidgets

当我尝试删除所有它们时,它们应该从布局中删除(因为函数layout.count()返回 0),但它们仍然显示在界面中,我可以与它们交互。

在这里,您可以使用我添加小部件的方式:

void MyClass::addCustomWidget(CustomWidget *_widget, int r, int c)
{
    layout->addWidget(_widget, r, c);
    _widget->show();
}

这里是我删除它们的方式:

void MyClass::clearLayout()
{
    qDebug() << "Layout count before clearing it: " << layout->count();

    int count = layout->count();
    int colums = layout->columnCount();
    int rows = layout->rowCount();

    int i=0;
    for(int j=0; j<rows; j++)
    {
        for(int k=0; k<colums && i<count; k++)
        {
            i++;

            qDebug() << "Removing item at: " << j << "," << k;
            QLayoutItem* item = layout->itemAtPosition(j, k);

            if (!item) continue;

            if (item->widget()) {
                layout->removeWidget(item->widget());
            } else {
                layout->removeItem(item);
            }
            qDebug() << "Removed!";
        }
    }

    qDebug() << "Layout count after clearing it: " << layout->count();
}

从 QGridLayout 中正确删除项目/小部件的任何帮助或提示?

PD:我在互联网上看到很多人在将小部件从布局中删除后直接删除(删除_widget)。就我而言,这是不可能的,因为我需要在内存中保留这些小部件。

4

5 回答 5

3

您还可以deleteLater()用来避免在迭代期间维护子计数的问题:

for (int i = 0; i < gridLayout.count(); i++)
{
   gridLayout.itemAt(i)->widget()->deleteLater();
}
于 2017-03-12T10:35:02.637 回答
2

只是要清楚。您没有“删除”小部件。您只是将它们从布局中删除。从布局中删除仅意味着该布局将不再管理(调整大小/定位)该小部件,但这并不意味着该小部件将被“删除”(以 C++ 方式)。小部件也不会被神奇地隐藏。从布局中删除后,您的小部件仍保留在它创建/管理的小部件中。因此,此布局的所有者仍将此小部件作为子小部件(可见子代)。

你必须

  1. 隐藏小部件,或者如果您确定将不再使用它

  2. 使用“删除”关键字删除小部件

你也不需要打电话removeWidget(item->widget())removeItem(item)足以满足所有布局项目(即使是那些内部有小部件的项目)

于 2012-05-23T08:44:00.840 回答
1

尝试

QLayoutItem *child;
while ((child = layout->takeAt(0)) != 0);

应该是安全的。如果由于任何原因它不起作用,您可以使用小部件或布局项的集合,每次添加小部件时都会更新。然后删除你在集合上的循环并从布局中删除每个元素。

于 2012-05-23T08:44:13.383 回答
0
Header:
class Grid : QGridLayout
{
public:
    Grid(QWidget* parent);
    void addElement(QWidget* element, int x, int y);
    void delElement(int x, int y);
    void resize(int width, int height);
    void clear();
protected:
    QSize size;
};

void Grid::clear(){
    for(int i = 0;i<size.width();i++){
        for(int j = 0;j<size.height();j++){
            QLayoutItem* item = takeAt(i*size.width() + j);
            if(item != NULL) delete item;
        }
    }
}
于 2014-02-27T10:10:28.950 回答
0

这些答案都不适合我。在我的情况下,我有几个对象,每个对象都有自己的 QChartView。这个想法是用户选择他们想要查看的对象,并且主窗口中央的公共区域使用用户选择的对象的 QChartView 进行更新。这应该很简单,只需从图表区域中删除小部件,添加一个新小部件。最终为我工作的是:

while( QLayoutItem* item = ui->mPlotArea->layout()->takeAt(0) )
{
    item->widget()->setVisible(false);
    ui->mPlotArea->layout()->removeItem(item);
}

ui->mPlotArea->layout()->addWidget( pv );
pv->setVisible(true);

哪里mPlotArea是 aQFrame并且pv是 的派生类QChartView。我无法解释为什么其他答案不起作用,但我花了几个小时尝试不同的小部件和不同的删除方式而不删除、组织等......

于 2020-10-01T21:43:11.137 回答