QWidget удаляет себя из графического интерфейса при уничтожении? - PullRequest
8 голосов
/ 17 мая 2011

Если я удаляю QWidget с помощью delete, отменяется ли его регистрация в графическом интерфейсе или это нужно делать вручную? Есть ли логическая причина такого поведения?

Ответы [ 2 ]

12 голосов
/ 17 мая 2011

Когда вы вызываете addWidget для макета или сгруппированного виджета, право собственности на виджет передается на макет / скомпонованный виджет.Все это означает, что если макет / сложенный виджет будет удален, то все виджеты, которые были добавлены в него, также будут удалены.

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

Если вы не хотите, чтобы ваш виджет был удален, когда макет / сложенвиджет будет удален, тогда вы бы позвонили removeWidget.Обратите внимание, что неясно, куда на самом деле переходит владение виджетом.Простое тестовое приложение.Я только что написал, что removeWidget даже не передал владение от QStackedWidget вообще!

Итак, чтобы ответить на ваш вопрос, Qt правильно удалит виджет из макета / сложенного виджета, если вы удалитеЭто.Кроме того, это правильный способ удаления виджета, если он больше не принадлежит макету / сложенному виджету.

7 голосов
/ 17 мая 2011

Как уже указывалось @CatPlusPlus, Qt использует систему владения. Поэтому всякий раз, когда вы добавляете виджеты в макеты или макеты в виджеты и так далее, право собственности на получателя передается сумматору / родителю. Обычно это документируется в документации по методу. Например, если вы посмотрите документацию для QWidget :: addLayout (QLayout *), то там будет сказано, что Qwidget становится владельцем QLayout. Когда вы удаляете родителя, он удаляет также и всех своих потомков. Прочитайте эту статью для получения дополнительной информации.

Деревья объектов и собственность в Qt

Этот метод очень полезен, потому что в традиционном C ++ разработчик должен отслеживать каждый бит памяти, выделяемый в куче. Однако эта система владения требует, чтобы разработчик следил только за родителями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...