Название: 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-объект. и подтвердил это правило на примере: Код: // При такой инициализации поиск работает Однако, у меня есть проект вот с такими исходниками: 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 |