5

我有一个非常基本的疑问QGridLayout。为了在其中添加一个小部件,QGridLayout我们给出QWidget *的应该与row& columnno 一起添加(也包括其他一些参数)。现在要删除一个小部件,没有功能可以根据行和列删除一个小部件,例如:

int row, column;
gridObj->remove(row, column);

我认为QGridLayout必须维护一种QList存储Widgets & there 位置的引用。那么为什么没有仅按位置删除小部件的功能呢?它只有 1 个删除函数,我们需要为其指定QWidget对象的引用。

如果这是某种限制,那么是否有解决此问题的方法?自己维护一个 QList 是一种解决方案,但它非常乏味。谢谢你

4

2 回答 2

5

我可能在这里弄错了,但是从浏览文档中,试试这个:

  1. 获取该位置的 QLayoutItem ( QGridLayout::itemAtPosition (row, column) )。
  2. 使用 QLayoutItem 获取小部件指针(QLayoutItem::widget ())。
  3. 使用小部件指针在 QGridLayout ( QLayout::indexOf (widgetPointer) ) 中查找小部件的索引。
  4. 使用索引从布局中获取小部件的所有权(QGridLayout::takeAt (index))。
  5. 把它全部包装在一个方便的函数中?

我一直在重新排列布局中的小部件、从布局中删除小部件等方面遇到麻烦……通常,我只是求助于删除布局并重新添加小部件。=(

于 2013-03-23T16:31:27.303 回答
4

要按布局位置删除 QGridLayout 中的小部件,您可以简单地使用

layout->removeWidget(layout->itemAtPosition(row, column)->widget());

但是,您必须注意以下几点:

  • 此代码假定布局中的指定位置实际上有一个项目。如果不是, itemAtPosition() 将返回 null。所以你需要确定这个位置,或者明确地检查它。
  • 此代码将从布局中删除小部件,但不会将其删除。您必须将小部件放回不同的布局或自己给小部件一个合理的几何形状。如果您不这样做,小部件将在其当前位置保持可见。如果您希望小部件被破坏,则必须在将其从布局中删除后显式删除它。
  • 此代码仅适用于布局中已添加addWidget(). 它不适用于使用addLayout(). 如果您还需要关心嵌套布局,请参阅 我关于从网格布局中删除行和列的答案
于 2013-10-08T20:32:48.310 回答