Russian Qt Forum

Qt => Общие вопросы => Тема начата: xintrea от Август 29, 2015, 19:49



Название: findChild() - почему срабатывает без указателя на parent? Забыл за давностью лет
Отправлено: xintrea от Август 29, 2015, 19:49
В Qt у каждого наследника QObject есть имя, которое устанавливается через setObjectName(). И есть метод findChild(), который способен искать объект по имени и типу (причем рекурсивно).

Поиск происходит примерно так:

Код:
MyObject *findObj=StartObject->findChild<MyObject *>("myObject");

Я написал краткий пример, в котором проверяю, как работает поиск (прикреплен к сообщению).

Поигравшись с примером, я написал вот такую статью-объяснение, в которой вроде все логично написано: http://webhamster.ru/mytetrashare/index/mtb0/1440832556nzl24l7k21

В частности, в статье я вывел следующее правило:

Цитировать
Поиск будет работать только в том случае, если в объекте класса, унаследованного от QObject, будет задан parent-объект.

и подтвердил это правило на примере:

Код:
// При такой инициализации поиск работает
First *first=new First(pMainWindow);
first->setObjectName("first");

Second *second=new Second(pMainWindow);
second->setObjectName("second");


// При такой инициализации поиск не работает
First *first=new First();
first->setObjectName("first");

Second *second=new Second();
second->setObjectName("second");


Однако, у меня есть проект вот с такими исходниками:

https://github.com/xintrea/mytetra_dev/commit/9412b044c108fe6cbe03e39c5c2a8421a530fadb

(последний рабочий коммит - 9412b044c108fe6cbe03e39c5c2a8421a530fadb)

И в этом проекте волшебным образом работает поиск через findChild(), несмотря на то, что объекты не имеют родителей.

Смотрим файл src/views/mainWindow/MainWindow.cpp, метод setupUI(). В нем создаются объекты без родителя, и нигде больше родитель для этих объектов не задается. Но несмотря на это, поиск таких объектов работает:

Код:
find_object<TreeScreen>("treeScreen")->saveKnowTree();

Реализация find_object() использует findChild(), и расположена в main.h (темплейт).


Вопрос. Почему в проекте поиск работает несмотря на то, что parent не задан? А почему в примере поиск не работает, если parent не задан?


Название: Re: findChild() - почему срабатывает без указателя на parent? Забыл за давностью лет
Отправлено: Old от Август 29, 2015, 20:46
А вы попробуйте распечатать паренты этих объектов перед поиском. ;)
Я проект не смотрел, но думаю что вы используете layout, а они при добавлении в них виджетов, устанавливаю им parent.


Название: Re: findChild() - почему срабатывает без указателя на parent? Забыл за давностью лет
Отправлено: Bepec от Август 29, 2015, 21:01
+1 к Old.
Виджеты без родителя при show появятся в отдельных окнах.
Вот у вас по коду указатели передаются в global parameters, а что там дальше делается отслеживать лень. Скорее всего какой то класс берёт и задаёт им родителя :)


Название: Re: findChild() - почему срабатывает без указателя на parent? Забыл за давностью лет
Отправлено: xintrea от Август 29, 2015, 21:07
но думаю что вы используете layout, а они при добавлении в них виджетов, устанавливаю им parent.

Да, именно так и происходит.

Но теперь другой вопрос.

Помнится мне, что была какая-то трабла, когда в MainWindow создаешь объект, и при создании задаешь ему в качестве parent ссылку this. А потом засовываешь объект в layout, и происходила какая-то нехорошая вещь.

Вот не помню, в чем была проблема. То ли заданный parent не менялся, то ли наоборот менялся на layout, и из-за этого какие-то глюки были.

Вы с чем-то похожим сталкивались?


Название: Re: findChild() - почему срабатывает без указателя на parent? Забыл за давностью лет
Отправлено: Old от Август 29, 2015, 21:14
Я таких проблем не припомню...


Название: Виталий Майоров - Книга "Ни шагу назад"
Отправлено: Vitaliymayorovhip от Август 30, 2015, 09:20
http://vitalii-maiorov.livejournal.com
Приятного аппетита, мои дорогие читатели!
Блюдо подано. Специи рекомендую не добавлять,
их здесь предостаточно
https:/www.sendspace.com/file/601x26
http://www.ex.ua/272541164078