Russian Qt Forum
Апрель 18, 2024, 11:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: findChild() - почему срабатывает без указателя на parent? Забыл за давностью лет  (Прочитано 3502 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Август 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 не задан?
Записан

Собираю информацию по крупицам
http://webhamster.ru
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #1 : Август 29, 2015, 20:46 »

А вы попробуйте распечатать паренты этих объектов перед поиском. Подмигивающий
Я проект не смотрел, но думаю что вы используете layout, а они при добавлении в них виджетов, устанавливаю им parent.
Записан
Bepec
Гость
« Ответ #2 : Август 29, 2015, 21:01 »

+1 к Old.
Виджеты без родителя при show появятся в отдельных окнах.
Вот у вас по коду указатели передаются в global parameters, а что там дальше делается отслеживать лень. Скорее всего какой то класс берёт и задаёт им родителя Улыбающийся
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #3 : Август 29, 2015, 21:07 »

но думаю что вы используете layout, а они при добавлении в них виджетов, устанавливаю им parent.

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

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

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

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

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

Собираю информацию по крупицам
http://webhamster.ru
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #4 : Август 29, 2015, 21:14 »

Я таких проблем не припомню...
Записан
Vitaliymayorovhip
Гость
« Ответ #5 : Август 30, 2015, 09:20 »

http://vitalii-maiorov.livejournal.com
Приятного аппетита, мои дорогие читатели!
Блюдо подано. Специи рекомендую не добавлять,
их здесь предостаточно
https:/www.sendspace.com/file/601x26
http://www.ex.ua/272541164078
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.151 секунд. Запросов: 22.