Как удалить QWidgets из QSplitter - PullRequest
13 голосов
/ 16 декабря 2008

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

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

Ответы [ 6 ]

22 голосов
/ 19 декабря 2008

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

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

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

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

12 голосов
/ 16 декабря 2008

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

Когда вы прячете () ребенка, его пространство будет распределяться среди других дети. Будет восстановлен, когда ты показываешь () это снова.

1 голос
/ 16 декабря 2008

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

0 голосов
/ 19 июня 2013

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

frameA->setVisible(conditionA);
frameB->setVisible(conditionB);
if ( !(conditionA && conditionB) ) // if only 1 frame is visible
{
   splitter->handle(0)->setVisible(false);
}
0 голосов
/ 04 августа 2010

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

0 голосов
/ 08 марта 2009

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

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

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

...