В 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 не задан?