qt - 关于 Qt 4 中的删除、移除小部件和布局

标签 qt layout widget qt4

(我使用 Qt 4.7、Windows 7、64 位)。

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

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

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

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

如果我这样做:对于每个布局中的每个元素,takeAt(0) 我有一个 QLayoutItem,里面有一个小部件...如何在不删除小部件的情况下删除布局项?....如何删除小部件而不删除小部件杀死它,无论是在 parent 还是 child 身上?因为布局中有很多删除方法:removeItem、removeWidget...,但没有 takeWidget...只是 takeAt() ,它给出了一个 Qlayoutitem。

我尝试了多种方法,但无论发生什么情况我仍然可以看到这些小部件。

有关此问题:

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

  • removeAt(index) 是否执行小部件的删除方法?

最佳答案

好的。我成功了。 让我解释一下删除、保留小部件是如何工作的。

小部件通过其父布局来识别。然后你通过布局将其删除。通过这样做:

layout()->removeAt(widget);
delete widget;

如果您在 QLayout(或其子级)中使用 takeAt(index),它会为您提供一个 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 Docs 上的理解)。

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

(Qt 4.7 QList Docs)"Removes the item at index position i. i must be a valid index position in the list (i.e., 0 <= i < size())."

在QLayout中,removeWidget或removeItem不会删除项目/小部件,您有责任删除它,就像我之前所做的那样。

(Qt 4.7 QLayout Docs) "Removes the widget widget from the layout. After this call, it is the caller's responsibility to give the widget a reasonable geometry or to put the widget back into a layout."

希望有帮助。如果您发现任何错误,可以告诉我,我将编辑答案!

有关删除的更多信息,请参见此处: Other stackoverflow post

关于qt - 关于 Qt 4 中的删除、移除小部件和布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17703513/

相关文章:

c++ - 将误差条添加到 VTK 二维散点图

c++ - 如何过滤 QAbstractTableModel 模型

java - 如何将 JComponent 添加到 Box 的某个索引

java - 我在 Xoom 上的 UI 看起来很难看/不像在 eclipse 中的样子

qt - 制作一个新的小部件并在表单中使用

python - 从 Django 的 TextArea 小部件中删除标签

c++ - 是否可以将 Qt Creator 2.7 与 Visual Studio 2012 编译器一起使用并拥有其所有功能?

c++ - 将自定义 qt 小部件动态添加到框架中,而无需每次都更改布局

jquery - 输入元素的流体宽度

android - 在 Android Widget 上处理多个按钮单击