Как удалить QWidgets из QSplitter
Вопрос
В моем приложении есть окно, разделенное QSplitter, и мне нужно удалить виджет.
Как я могу это сделать?Я не могу найти полезные методы
Решение
Многие вещи в Qt не могут быть удалены "традиционно".Вместо этого вызовите hide() для него и уничтожьте его.От QSplitter Документация:
Когда вы скрываете() дочерний элемент, его пространство будет распределено между другими дочерними элементами.Он будет восстановлен, когда вы снова покажете () его.
Другие советы
Мне непонятно, хотите ли вы сохранить виджет и поместить его куда-нибудь еще, или вы хотите уничтожить виджет.
Уничтожение виджета: Если вы можете получить указатель на виджет, вы можете просто удалить его.Разделитель будет безопасно уведомлен о том, что его дочерний элемент удаляется, и удалит его из самого себя.
Сохранение виджета: Если вы возьмете указатель на виджет, вы можете просто установить его родительским элементом какой-либо другой виджет и добавить его в другой макет виджета, и он появится там.Это безопасно, потому что QSplitter будет уведомлен о том, что один из его дочерних элементов восстанавливается.
Если вы хотите установить родительскому элементу значение NULL (ответ cjhuitt), имейте в виду, что теперь вы несете ответственность за очистку этой памяти, поскольку у виджета больше нет родительского элемента.
Мне нравится ответ Туминоида.Но если вам абсолютно необходимо его удалить, попробуйте получить виджет, который вы хотите удалить, и вызвать setParent( NULL )
на этом виджете.Это мое лучшее предположение.
Если вы держите указатель на виджет, то просто удалите его или используйте deleteLater(), если хотите подстраховаться.
Если у вас нет указателя виджета, используйте функцию QSplitter::widget(int index).Затем вы можете использовать вызов его слота deleteLater().
Если у вас нет индекса виджета, но вы все еще знаете widget 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(дочерний).Это также рекомендуемый способ удаления виджета из разделителя.(Документация Qt)