Qt 如何从QSplitter中删除QWidgets

Qt 如何从QSplitter中删除QWidgets,qt,parent,qwidget,qsplitter,Qt,Parent,Qwidget,Qsplitter,在我的应用程序中,有一个被QSplitter拆分的窗口,我需要删除一个小部件 我该怎么做?我找不到有用的方法Qt中的许多东西是“传统”无法删除的。而是对其调用hide()并将其销毁。从文件: 隐藏()子对象时,其空间将 相互分配 儿童届时将恢复原貌 你再展示一次 我喜欢Tuminoid的回答。但是如果您确实需要删除它,请尝试获取要删除的小部件,并在该小部件上调用setParent(NULL)。这是我最好的猜测。我不清楚您是想保留小部件并将其放在其他地方,还是想销毁小部件 销毁小部件:如果可以

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


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

Qt中的许多东西是“传统”无法删除的。而是对其调用hide()并将其销毁。从文件:

隐藏()子对象时,其空间将 相互分配 儿童届时将恢复原貌 你再展示一次


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

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

  • 销毁小部件:如果可以 获取指向小部件的指针,您可以 只需删除它。拆分器将 安全地被告知其孩子已死亡 正在删除并将删除它 从它自己

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


如果要将父项设置为NULL(cjhuitt的答案),请注意,您现在负责清理该内存,因为该小部件不再具有父项。

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

如果没有小部件指针,请使用qspliter::widget(int index)函数。然后,可以使用invoke其deleteLater()插槽


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

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

我遇到了同样的问题。在Qt4.8中,要临时隐藏QSplitter的一个小部件,我只需将其隐藏。但是,这还不够,因为拆分器手柄仍然可以移动。但句柄也可以访问和隐藏:

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

为takeWidget提供指向文档的链接。没有
qspliter.takeWidget
。请注意,当您将父窗口设置为NULL时,您的小部件将成为一个主窗口。。。(除非你先把它藏起来。)