【问题标题】:How to remove QWidgets from QSplitter如何从 QSplitter 中删除 QWidgets
【发布时间】:2010-09-27 03:52:43
【问题描述】:

在我的应用程序中有一个由 QSplitter 拆分的窗口,我需要删除一个小部件。

我该怎么做?我找不到有用的方法

【问题讨论】:

    标签: qt parent qwidget qsplitter


    【解决方案1】:

    我不清楚您是要保留小部件并将其放在其他地方,还是要销毁小部件。

    • 销毁小部件:如果可以的话 获取指向小部件的指针,您可以 只需删除它。分离器将 安全地通知它的孩子是 被删除并将删除 来自自身。

    • 保留小部件:如果你抓住 指向小部件的指针,您可以 只需将其父级设置为其他 小部件并将其添加到另一个 小部件的布局,它将显示 那里。这是安全的,因为 QSplitter 将被通知一个 的孩子正在重新成为父母。

    如果您想将父级设置为 NULL(cjhuit 的回答),请注意您现在负责清理该内存,因为小部件不再有父级。

    【讨论】:

    • 请注意,当您将父级设置为 NULL 时,您的小部件将成为主窗口...(除非您先将其隐藏。)
    【解决方案2】:

    Qt 中的许多东西不能“传统地”删除。而是在其上调用 hide() 并销毁它。来自QSplitter 文档:

    当你 hide() 一个孩子时,它的空间会 分配给其他人 孩子们。什么时候恢复 你再次显示()它。

    【讨论】:

      【解决方案3】:

      我喜欢 Tuminoid 的回答。但是,如果您绝对需要删除它,请尝试获取要删除的小部件,并在该小部件上调用 setParent( NULL )。这是我的最佳猜测。

      【讨论】:

        【解决方案4】:

        如果您持有指向小部件的指针,则只需将其删除,或者如果您想安全起见,请使用 deleteLater()。

        如果您没有小部件指针,请使用 QSplitter::widget(int index) 函数。然后,您可以调用它的 deleteLater() 槽。

        如果您没有小部件索引,但您仍然知道小部件 objectName(),那么 QObject::findChild() 是您获取小部件指针的唯一方法。

        【讨论】:

          【解决方案5】:

          我遇到了同样的问题。在 Qt 4.8 中,为了暂时隐藏 QSplitter 的小部件之一,我只是将其隐藏。然而这还不够,因为分离器手柄仍然可以移动。但是也可以访问和隐藏句柄:

          frameA->setVisible(conditionA);
          frameB->setVisible(conditionB);
          if ( !(conditionA && conditionB) ) // if only 1 frame is visible
          {
             splitter->handle(0)->setVisible(false);
          }
          

          【讨论】:

            【解决方案6】:

            另一个防止子部件被删除的简单方法是使用 QSplitter.takeWidget(child)。这也是从拆分器中删除小部件的推荐方法。 (Qt 文档)

            【讨论】:

            • 为 takeWidget 提供一个文档链接。
            • 没有QSplitter.takeWidget这样的东西。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-03
            • 1970-01-01
            • 2021-12-26
            • 2017-06-24
            相关资源
            最近更新 更多