QT – зачем указывать родителя с графическими виджетами?

Вопрос: Вопрос: указание родителя с Qt всегда кажется хорошей идеей. Однако я не понимаю, почему это требуется в некоторых конкретных случаях. Существует много примеров использования QGraphicsView следующим образом: MainWindow::MainWindow() { QGraphicsView *view = new QGraphicsView(this); ... } Итак, почему это лучше, чем QGraphicsView *view = new QGraphicsView(NULL)? в этом конкретном случае? Спасибо, Алекс Лучший ответ:

Вопрос:

Вопрос: указание родителя с Qt всегда кажется хорошей идеей. Однако я не понимаю, почему это требуется в некоторых конкретных случаях. Существует много примеров использования QGraphicsView следующим образом:

MainWindow::MainWindow() { QGraphicsView *view = new QGraphicsView(this); … }

Итак, почему это лучше, чем QGraphicsView *view = new QGraphicsView(NULL)? в этом конкретном случае?

Спасибо, Алекс

Лучший ответ:

Я хотел бы поблагодарить УмНиобе и Энтони за то, что помог мне разобраться.

Во всяком случае, мне пришлось искать источники QT, чтобы выяснить, что происходит за занавеской.

Поэтому я понимаю всю идею QObjects следующим образом. Когда новый QObject создается с указанным родителем, QObjectPrivate::setParent_helper(QObject *parent) скрытая QObjectPrivate::setParent_helper(QObject *parent). Он действительно регистрирует ребенка с родителем:

parent->d_func()->children.append(q); // Strange, they didn’t use ‘this’ to register the object 🙂

Так что технически говоря, создание дочернего элемента с родителем позволяет родителям регистрировать ребенка. Поэтому указание родителя при создании ребенка является полезной привычкой.

В некоторых случаях отношение parent-child задается позже в любом случае (см. Ответ Anthony), поэтому родительский элемент не может быть указан.

Ответ №1

QWidget без родителя фактически является окном верхнего уровня. Однако иногда люди опускают указание родителя при создании QWidget, потому что родитель будет автоматически установлен позже, например, когда QWidget является частью макета. Например:

QGraphicsView *vew = new QGraphicsView; // the view has no parent QBoxLayout *layout = new QHBoxLayout; layout->addWidget(view); centralWidget()->setLayout(layout); // this automatically reparents the view to ‘this’

Не имеет значения, передаете ли вы this новому QGraphicsView или повторите его позже. Я не думаю, что это лучше, но я всегда делаю последнее, потому что это выглядит лучше для меня.

Ответ №2

“Указание родителя с Qt всегда кажется хорошей идеей”

Есть объяснение.

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

можете ли вы объяснить, как родительское окно становится известно о детском представлении?

Существует внутренняя функциональность для ребенка, чтобы добавить себя к родительскому объекту. Это определенно используется как в конструкторе QObject и в QObjet::setParent(QObject * parent). Вы можете заметить из подписи, что нет const везде, что, так как дочерний объект будет изменять родитель.

Оцените статью
Добавить комментарий