关于删除、删除Qt4中的小部件和布局

关于删除、删除Qt4中的小部件和布局,qt,layout,widget,qt4,Qt,Layout,Widget,Qt4,(我使用Qt4.7,Windows7,64位) 我创建了一个自定义表。每一行都是带有小部件的水平布局。 这些行保存在QList中,以便于访问,子行也是如此。这些行也添加到父窗口小部件中 如果我调整父窗口小部件的大小,我会计算新的大小,删除所有内容,然后重新创建它 我的问题是我不想删除任何小部件。只有当我清理桌子的时候,我才会这样做 由于我在QList和父布局中都有小部件,如何删除每行中的所有小部件,删除所有布局,然后将它们添加到新布局中 如果我这样做:对于每个布局中的每个元素,我都有一个QLay

(我使用Qt4.7,Windows7,64位)

我创建了一个自定义表。每一行都是带有小部件的水平布局。 这些行保存在QList中,以便于访问,子行也是如此。这些行也添加到父窗口小部件中

如果我调整父窗口小部件的大小,我会计算新的大小,删除所有内容,然后重新创建它

我的问题是我不想删除任何小部件。只有当我清理桌子的时候,我才会这样做

由于我在QList和父布局中都有小部件,如何删除每行中的所有小部件,删除所有布局,然后将它们添加到新布局中

如果我这样做:对于每个布局中的每个元素,我都有一个QLayoutItem,里面有一个小部件。。。如何在不删除小部件的情况下删除layoutItem?。。。。如何在不杀死小部件的情况下删除它,无论它是在父级还是在子级?因为有很多方法可以删除:removeItem、removeWidget。。。在布局中,但不是takeWidget。。。只需takeAt()就可以得到一个Qlayoutitem

我尝试了几种方法,但不管小部件发生了什么,我仍然可以看到它们

有关这方面的问题:

  • 小部件何时被删除?如果我从布局中获取Widget(索引),它是否会在某个时间被删除?如果我在另一个列表中有指向它的指针,会发生这种情况吗

  • removeAt(index)是否执行小部件的delete方法


Qt中的控件是一个规则C++对象,可以用C++ <代码>删除< /C>操作符作为其他对象删除:

delete myWidget;
在Qt中,小部件之间始终存在父子关系。当父部件被销毁时,它将删除其所有子部件。通常,您不需要考虑显式删除任何小部件,只需删除顶级小部件,即窗口和对话框。Qt将负责删除任何子窗口小部件

QList::removeAt(int)
不会删除被删除的对象,它只会从列表中删除该对象。如果还想删除对象,则必须执行以下操作:

delete myList.takeAt(0);
这适用于所有函数,如
removeAt(int)
takeAt(int)
takeFirst()
,等等。它们从不删除对象,只从容器中删除对象(列表、布局、滚动区域等)。在大多数情况下,小部件的所有权转移给调用者(当父子关系中断时,调用者将负责删除小部件),但不要假设总是这样,请始终阅读函数的文档。

确定。我让它工作了。 让我解释一下移除、保留小部件是如何工作的

小部件由其父布局可知。然后通过布局将其删除。通过这样做:

layout()->removeAt(widget);
delete widget;
如果您在QLayout(或其子项)中使用takeAt(索引),它将为您提供一个QLayoutItem。要访问内部的小部件,只需使用widget()。但是如果不删除小部件,就无法删除它。因此,这种方法是无效的

在文档中,它说明了删除元素的方法:

QLayoutItem *child;
while ((child = layout->takeAt(0)) != 0)  {
    ...
    delete child;
}
Qt中需要特别注意的是: 如果您有一个布局的层次结构树,在布局中添加了addLayout(),则无论小部件插入的深度有多深,如果布局中的树路径以及此项是从子布局构建的,则可以将其从子布局或任何父布局中删除

最简单的方法是在自定义表中保留指向所有项的指针列表。清除表以重建它时,只需在小部件中执行以下操作:

  CustomTableItem* item;
  while ( !items_.isEmpty() && ( (item = items_.takeFirst()) != 0 ) ){
    layout()->removeWidget(item);
    delete item; // It works no matter where the item is
  }

  items_.clear(); // clear the list afterwards.
它工作得很好,也能自动更新布局。 如果要保留这些元素,只需跳过“删除项”,然后再使用它们

需要注意的一点是,不同的“删除”函数在QList或类似的小部件中以及在QLayout中的工作方式不同(正如我在Qt文档中所理解的那样)

在QList中,removeAt实际上删除了对象


(Qt4.7 QList Docs)“删除索引位置i处的项。我必须是列表中的有效索引位置(即,0,谢谢!但我的特殊问题是什么:我有一个QBoxLayout。我做:takeAt(int)来获取元素。它不是一个小部件,而是一个QLayoutItem。要获取小部件,我使用。小部件(void)函数。但是窗口小部件仍然在里面。我怎么取出这个小部件并删除LayoutItem?Fyy席上没有这个功能。FYY在Python中无效。你必须要处理内部C++对象。LayOutE()-ReaveAT(WIDGET);只存在于QGrasiScDead。你的意思可能是LayOutE()-> ReaveWiGET(小部件)。;这也是从布局中删除小部件而不删除它的方法。如果没有小部件指针,请执行以下操作:QLayoutItem*item=layout->itemAt(0);QWidget*widget=item->widget();如果(widget!=NULL){layout->removeWidget(小部件)如果你想删除这个小部件,那么做:WIDGET-> SETHORDER(NULL);删除WITGET;}(格式化不起作用,但是你得到了主意……)FY:这在Python中是无效的,因为你也要处理内部C++对象。,必须调用item->deleteLater(),如“其他帖子”中所示。否则将发生堆损坏。