【问题标题】:Remove Widget from QGridLayout in Qt? [duplicate]从 Qt 中的 QGridLayout 中删除小部件? [复制]
【发布时间】:2013-03-23 16:11:14
【问题描述】:

我对@9​​87654321@ 有一个非常基本的疑问。 为了在QGridLayout 中添加一个小部件,我们给出了QWidget *,它应该与rowcolumn no(以及其他一些参数)一起添加。 现在要删除一个小部件,没有功能可以根据行和列号删除一个小部件,即类似这样的东西:

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

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

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

【问题讨论】:

  • 首先,为什么你没有任何关于创建的小部件的指针?

标签: c++ qt


【解决方案1】:

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

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

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

  • 此代码假定实际上有一个项目 布局中的指定位置。如果不是, itemAtPosition() 将 返回空值。所以你需要确定位置,或者明确检查。
  • 此代码将从布局中删除小部件,但不会将其删除。 您必须将小部件放回不同的布局或提供 小部件自己合理的几何形状。如果你不这样做,小部件将简单地保留 在当前位置可见。如果您希望小部件是 被破坏,你必须在它被删除后明确地删除它 从布局中移除。
  • 此代码仅适用于布局中的顶级小部件 添加了addWidget()。它不适用于使用addLayout() 添加的嵌套布局。 如果您还需要关心嵌套布局,请参阅 my answer about removing rows and columns from grid layouts

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 非常感谢您的回答,我会尝试并回复您。关于 Qt 中布局的复杂性,我也有同感。有时我想知道为什么他们让这个使用起来如此荒谬。但无论如何,Qt 的其余部分都很好理解......
    • 在网格布局中,QLayout::indexOf()返回的no是什么?是行号还是列号,还是只是列表的某个索引?
    • 我很确定它是列表中的一维索引。