在我的应用程序中有一个由QSplitter分割的窗口,我需要删除一个小部件。
我该怎么做?我找不到有用的方法
答案 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文档)