Как предотвратить удаление ребенка во время deleteChildren () в Qt? - PullRequest
2 голосов
/ 29 ноября 2011

У меня есть интерфейс ведения журнала, который позволяет пользователю создавать подкласс Logger и переопределять виртуальную функцию log(), чтобы пользователи могли создавать свои собственные регистраторы. Существует менеджер, который отслеживает все зарегистрированные методы ведения журнала (т. Е. Консоль, системный журнал, виджет и т. Д.)

Я создал регистратор QListWidget, который показывает журналы. К сожалению, он принадлежит менеджеру журналов и, поскольку это QObject, он также является потомком MainWindow. Это приводит к тому, что два объекта пытаются удалить его после закрытия приложения.

При первом вызове QObjects->deleteChildren() вызывается и удаляется. Затем gmanager Loggin пытается снова и CRASH.

Как я могу предотвратить уничтожение определенного объекта QObject во время deleteChildren()? Это плохая идея?

1 Ответ

5 голосов
/ 29 ноября 2011

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

Возможности:

  1. Сделать его дочерним для менеджера журналов
  2. Донвообще не давайте ему родителя, и пусть менеджер журналов удалит его
  3. Не стоит вообще давать ему родителя и используйте QSharedPointer / std :: shared_ptr (последний в C ++ 11), управляющий имиспользуя экземпляры QSharedPointer int mainwindow и logger.

Не зная кода, я бы сказал, что главное окно не должно связываться с logger, поэтому я полностью перенесу владельца в диспетчер.

Кроме того, я не вижу причины, по которой обычный интерфейс Logger вообще должен наследовать от QObject, поэтому я бы рассмотрел возможность полного удаления этого наследования (в результате чего остаются «принадлежащие только менеджеру журналов» и опции QSharedPointer).

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