从 QGridLayout 中删除 QWidgets
Removing QWidgets from a QGridLayout
我有一个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中正确删除项目/小部件的任何帮助或提示?
P.D. :我在互联网上看到很多人从布局中删除小部件后直接删除(删除_widget)。就我而言,这是不可能的,因为我需要在内存中维护该小部件。
您还可以使用deleteLater()
来避免维护子级的问题迭代期间计数:
for (int i = 0; i < gridLayout.count(); i++)
{
gridLayout.itemAt(i)->widget()->deleteLater();
}
只是为了清楚。您没有"删除"小部件。您只是从布局中删除了它们。从布局中删除仅意味着该小部件将不再受此布局的管理(调整大小/定位),但这并不意味着该小部件将被"删除"(以C++方式)。此外,小部件也不会神奇地隐藏。从布局中删除后,您的小部件仍保留在创建/管理的小部件中。因此,此布局的所有者仍然将此小部件作为子(可见子)进行。
你必须
-
隐藏小部件,或者如果您确定它不再被使用
-
使用"删除"关键字删除小部件
也不需要打电话给removeWidget(item->widget())
; removeItem(item)
足以满足所有布局项(即使是那些内部带有小部件的项目)
试试
QLayoutItem *child;
while ((child = layout->takeAt(0)) != 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;
}
}
}
这些答案都不适合我。 在我的情况下,我有几个对象,每个对象都有自己的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
是QFrame
,pv
是派生的QChartView
类。 我无法解释为什么其他答案不起作用,但我花了几个小时尝试不同的小部件和不同的删除方式,而无需删除、组织等......
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- 将指针设置为"nullptr"并不能防止双重删除?
- 为什么示例代码访问IUnknown中已删除的内存
- 如何通过 getter 函数删除矢量的元素?
- 从控制台中删除最后打印的元素
- 在 QLayout 中创建和删除自定义 QWidgets 时出现 RAM 问题
- 在 QGraphicsGridLayout 中从 QWidgets 中删除边框
- 从 QGridLayout 中删除 QWidgets