Вопрос

В моем приложении есть окно, разделенное 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)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top