我有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)。在我的情况下,这是不可能的,因为我需要在内存中保存那些小部件。
答案 0 :(得分:1)
要清楚。你没有“删除”小部件。您只从布局中删除它们。从布局中删除意味着此布局不再管理(调整大小/定位)窗口小部件,但这并不意味着窗口小部件将被“删除”(以C ++方式)。小部件也不会被神奇地隐藏。从布局中删除后,您的窗口小部件仍然在窗口小部件中创建/管理它。因此,此布局的所有者仍将此窗口小部件作为子窗口(可见子窗口)。
你必须
隐藏小部件,或者如果您确定不再使用小部件
使用“删除”关键字删除小部件
此外,您无需致电removeWidget(item->widget())
; removeItem(item)
对于所有布局项(甚至包含内部小部件的布局项)都足够了
答案 1 :(得分:0)
尝试
QLayoutItem *child;
while ((child = layout->takeAt(0)) != 0);
是supposed to be safe。如果由于任何原因它不起作用,您可以使用一组窗口小部件或布局项,每次添加窗口小部件时都会更新。然后删除集合上的循环并从布局中删除每个元素。
答案 2 :(得分: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;
}
}
}
答案 3 :(得分:0)
您还可以使用deleteLater()
来避免维护孩子的问题
在迭代期间计算:
for (int i = 0; i < gridLayout.count(); i++)
{
gridLayout.itemAt(i)->widget()->deleteLater();
}
答案 4 :(得分: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
是QFrame
,而pv
是QChartView
的派生类。我无法解释为什么其他答案没有奏效,但是我花了几个小时尝试不同的小部件和不同的删除方式,而不删除,组织等等。