2013-05-28 4 views
4

Я пишу некоторый Qt класс, который является производным от QObject, он выглядит следующим образом:Нужны ли QObject типам родительский QObject?

class A : public QObject 
{ 
    Q_OBJECT 
public: A() : QObject() {} 
..... 
} 

, но в нескольких местах, которые я видел, что QObject производных классов всех родителя, как:

class A : public QObject 
{ 
    Q_OBJECT 
public: A(QObject* parent = 0) : QObject(parent) {} 
..... 
} 

Итак, вопрос: нужен ли мне родитель или нет? В чем разница, если у меня его есть, если у меня есть значение по умолчанию (0), или у меня его вообще нет?

ответ

8

Как таковой, вам не нужен родитель.

Но установка родителя имеет некоторое преимущество с точки зрения сбора мусора.

Если вы установите родителя, а затем, когда родитель удаляется, он также удалит все его дочерние элементы.

После выписки из doc:

объекты QObject организоваться в объектные деревьев. Когда вы создаете объект QObject с другим объектом в качестве родителя, объект автоматически добавит себя в список child() родителя. Родитель берет на себя ответственность за объект; то есть он автоматически удаляет его дочерние элементы в своем деструкторе. Вы можете искать объект по имени и, при необходимости, с помощью findChild() или findChildren().

0

Вы должны позволяют установить родительский
, если вы хотите разрешить перемещение какой-либо объект, содержащий элемент типа class A в другой поток.
(Который вы действительно не в состоянии предотвратить.)
В этом случае, вероятно, должен быть перемещен элемент A.

От docs:

QEvent :: ThreadChange событие посылается этому объекту непосредственно перед сродства поток изменяется. Вы можете обработать это событие для выполнения любой специальной обработки. Обратите внимание, что любые новые события, которые отправляются на этот объект, будут обрабатываться в targetThread.

Так что, если вы не позволяете прохождения родителем, сопровождающим объекта, содержащего ваш класс должен переопределить event(), проверьте QEvent::ThreadChange и переместить вручную.

От docs:

QEvent :: ThreadChange событие посылается этому объекту непосредственно перед сродства поток изменяется. Вы можете обработать это событие для выполнения любой специальной обработки. Обратите внимание, что любые новые события, которые отправляются на этот объект, будут обрабатываться в targetThread.

Смежные вопросы