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