Как удалить QWidgets из QSplitter

В моем приложении есть окно, разделенное QSplitter, и мне нужно удалить виджет.

Как я могу это сделать? Я не могу найти полезные методы

Ответ 1

Многие вещи в Qt не могут быть "традиционно" удалены. Вместо этого вызовите hide() и уничтожьте его. Из QSplitter документация:

Когда вы скрываете() ребенка, его пространство будет быть распределены между другими дети. Он будет восстановлен, когда вы снова показываете().

Ответ 2

Мне не ясно, хотите ли вы сохранить виджет и поместить его в другое место, или если вы хотите уничтожить виджет.

  • Уничтожение виджета:. Если вы можете получить указатель на виджет, вы можете просто удалите его. Сплиттер будет безопасно получать уведомление о том, что его ребенок удаляется и удаляет его от себя.

  • Сохранение виджета: Если вы захватите   указатель на виджет, вы можете   просто установите родительский элемент на другой   виджета и добавить его в другой   виджета, и он будет отображаться   там. Это безопасно, поскольку   QSplitter будет уведомлен о том, что один   его детей репаратуется.

Если вы хотите установить родительский элемент в NULL (cjhuitt answer), имейте в виду, что теперь вы отвечаете за очистку этой памяти, потому что у виджета больше нет родителя.

Ответ 3

Мне нравится Туминоид. Но если вам это нужно, попробуйте получить виджет, который вы хотите удалить, и вызовите setParent( NULL ) в этом виджете. Это мое лучшее предположение.

Ответ 4

Если вы держите указатель на виджет, просто удалите его или используйте deleteLater(), если хотите быть в безопасности.

Если у вас нет указателя виджета, используйте функцию QSplitter:: widget (int index). Затем вы можете использовать вызов своего слота deleteLater().

Если у вас нет индекса виджета, но вы все еще знаете виджет objectName(), то QObject:: findChild() - это ваш единственный способ получить указатель виджета.

Ответ 5

Еще один простой способ предотвратить удаление дочернего виджета - использовать QSplitter.takeWidget(child). Это также рекомендуемый способ удаления виджета из сплиттера. (Документация Qt)

Ответ 6

Я столкнулся с той же проблемой. В Qt 4.8, чтобы временно скрыть один из виджета QSplitter, я просто спрячу его. Однако этого недостаточно, поскольку ручка сплиттера по-прежнему доступна для перемещения. Но ручку можно также открыть и скрыть:

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