如何从QSplitter中删除QWidgets

时间:2008-12-16 15:08:06

标签: qt parent qwidget qsplitter

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

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

6 个答案:

答案 0 :(得分:22)

我不清楚是否要保留小部件并将其放在其他位置,或者是否要销毁小部件。

  • 销毁小部件:如果可以的话 得到指向窗口小部件的指针,你可以 只需删除它。分裂器会 安全地被告知其孩子是 被删除并将其删除 从它自己。

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

如果你想将父设置为NULL(cjhuitt的答案),请注意你现在负责清理那个内存,因为这个小部件不再有父。

答案 1 :(得分:12)

Qt中的许多内容无法“传统”删除。而是在其上调用hide()并销毁它。来自QSplitter文档:

  

当你隐藏()孩子的空间时   在另一方之间分配   儿童。它将在恢复时恢复   你再次展示()它。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:-1)

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