在我的应用程序中有一个由 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 文档)