【发布时间】:2010-09-27 03:52:43
【问题描述】:
在我的应用程序中有一个由 QSplitter 拆分的窗口,我需要删除一个小部件。
我该怎么做?我找不到有用的方法
【问题讨论】:
标签: qt parent qwidget qsplitter
在我的应用程序中有一个由 QSplitter 拆分的窗口,我需要删除一个小部件。
我该怎么做?我找不到有用的方法
【问题讨论】:
标签: qt parent qwidget qsplitter
我不清楚您是要保留小部件并将其放在其他地方,还是要销毁小部件。
销毁小部件:如果可以的话 获取指向小部件的指针,您可以 只需删除它。分离器将 安全地通知它的孩子是 被删除并将删除 来自自身。
保留小部件:如果你抓住 指向小部件的指针,您可以 只需将其父级设置为其他 小部件并将其添加到另一个 小部件的布局,它将显示 那里。这是安全的,因为 QSplitter 将被通知一个 的孩子正在重新成为父母。
如果您想将父级设置为 NULL(cjhuit 的回答),请注意您现在负责清理该内存,因为小部件不再有父级。
【讨论】:
Qt 中的许多东西不能“传统地”删除。而是在其上调用 hide() 并销毁它。来自QSplitter 文档:
当你 hide() 一个孩子时,它的空间会 分配给其他人 孩子们。什么时候恢复 你再次显示()它。
【讨论】:
我喜欢 Tuminoid 的回答。但是,如果您绝对需要删除它,请尝试获取要删除的小部件,并在该小部件上调用 setParent( NULL )。这是我的最佳猜测。
【讨论】:
如果您持有指向小部件的指针,则只需将其删除,或者如果您想安全起见,请使用 deleteLater()。
如果您没有小部件指针,请使用 QSplitter::widget(int index) 函数。然后,您可以调用它的 deleteLater() 槽。
如果您没有小部件索引,但您仍然知道小部件 objectName(),那么 QObject::findChild() 是您获取小部件指针的唯一方法。
【讨论】:
我遇到了同样的问题。在 Qt 4.8 中,为了暂时隐藏 QSplitter 的小部件之一,我只是将其隐藏。然而这还不够,因为分离器手柄仍然可以移动。但是也可以访问和隐藏句柄:
frameA->setVisible(conditionA);
frameB->setVisible(conditionB);
if ( !(conditionA && conditionB) ) // if only 1 frame is visible
{
splitter->handle(0)->setVisible(false);
}
【讨论】:
另一个防止子部件被删除的简单方法是使用 QSplitter.takeWidget(child)。这也是从拆分器中删除小部件的推荐方法。 (Qt 文档)
【讨论】:
QSplitter.takeWidget这样的东西。