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

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

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


person Giancarlo    schedule 16.12.2008    source источник


Ответы (6)


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

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

person Tuminoid    schedule 16.12.2008

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

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

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

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

person Michael Bishop    schedule 19.12.2008
comment
Обратите внимание, что когда вы устанавливаете для родителя значение NULL, ваш виджет становится главным окном... (если вы не спрячете его сначала). - person Alexis Wilke; 22.01.2012

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

person Caleb Huitt - cjhuitt    schedule 16.12.2008

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

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

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

person Ariya Hidayat    schedule 07.03.2009

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

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

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

person Mathias Helminger    schedule 04.08.2010
comment
дайте ссылку на документ для takeWidget. - person W55tKQbuRu28Q4xv; 02.11.2010
comment
Нет такого понятия, как QSplitter.takeWidget. - person José Tomás Tocino; 19.09.2018