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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: вопрос по findChild()  (Прочитано 9216 раз)
yngwie
Гость
« : Июнь 19, 2009, 22:32 »

Здравствуйте вот небольшой пример объектной иерархии:
Код:
QObject *pobj1 = new QObject;
QObject *pobj2 = new QObject(pobj1);
QObject *pobj3 = new QObject(pobj2);

pobj2->setObjectName("first");
pobj3->setObjectName("second");

для того чтобы найти объект по его имени нужно передать его имя в функцию findChild().
Код:
QObject *find->findChild<QObject*>("first");

Мне не понятно что такое <QObject*>, и зачем это нужно?

Записан
spectre71
Гость
« Ответ #1 : Июнь 19, 2009, 22:48 »

Цитировать
T QObject::findChild ( const QString & name = QString() ) const
Returns the child of this object that can be cast into type T and that is called name, or 0 if there is no such object.
.......
Example:
QPushButton *button = parentWidget->findChild<QPushButton *>("button1");

Насколько я понимаю ищется объект obj типа QObject с заданным именем и делается qobject_cast<QPushButton*>(obj) [QPushButton* в примере], если результат NULL, то ищем далее пока не обойдем всех детей рекурсивно и или найдем или вернем NULL.
Записан
yngwie
Гость
« Ответ #2 : Июнь 19, 2009, 23:31 »

т.е findChildfindChild<QObject*> означает вернуть указатель и привести его к QObject* так?
<QObject*> это что-то типа макроса?
Записан
ритт
Гость
« Ответ #3 : Июнь 20, 2009, 00:09 »

гуглить на тему шаблонов в плюсах
Записан
spectre71
Гость
« Ответ #4 : Июнь 20, 2009, 00:37 »

гуглить на тему шаблонов в плюсах

Ну не сталкивался человек с шаблонами Подмигивающий, пора изучать. Шокированный


Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #5 : Июнь 20, 2009, 02:11 »

т.е findChildfindChild<QObject*> означает вернуть указатель и привести его к QObject* так?
<QObject*> это что-то типа макроса?

google => C++ member template functions
Записан
yngwie
Гость
« Ответ #6 : Июнь 20, 2009, 20:24 »

про шаблоны вроде разобрался. раз прототип этой функции такой:
Код:
T QObject::findChild ( const QString & name = QString() ) const

то получается т.к это шаблонная функция не-шаблонного класса то тип Т означает приведение к типу найденного объекта так? а где можно посмотреть реализацию этой функции, а то не очень понятно где еще она в своем теле использует тип Т.

и еще вопрос: Когда в не-шаблонном классе есть шаблонная  функция, то для генерации компилятором необходимого ее варианта, тип нужно обязательно указывать сразу после названия шаблонной функции но до ее аргументов?

Код:
findChild<QObject*>("имя объекта")

Это всегда для таких функций или все зависит от ее реализации ?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #7 : Июнь 22, 2009, 00:16 »

про шаблоны вроде разобрался. раз прототип этой функции такой:
Код:
T QObject::findChild ( const QString & name = QString() ) const

то получается т.к это шаблонная функция не-шаблонного класса то тип Т означает приведение к типу найденного объекта так? а где можно посмотреть реализацию этой функции, а то не очень понятно где еще она в своем теле использует тип Т.

Странный вопрос, в исходниках Qt естественно Улыбающийся Файлы qobject.h, qobject.cpp.

и еще вопрос: Когда в не-шаблонном классе есть шаблонная  функция, то для генерации компилятором необходимого ее варианта, тип нужно обязательно указывать сразу после названия шаблонной функции но до ее аргументов?

Код:
findChild<QObject*>("имя объекта")

Это всегда для таких функций или все зависит от ее реализации ?


Если функция принимает аргумент типа T, то компилятор сможет сам докумекать для какого типа нужно сгенерить реализацию. Например

Код
C++ (Qt)
class A
{
   public:
       template<typename T>
       void addValue(T a)
       {
           qDebug() << "Adding" << a;
       }
};
 

Тут при явном вызове

Код
C++ (Qt)
A a;
a.addValue(10); // 1
a.addValue(2.2); // 2
a.addValue<int>(0.1); // 3
 

сразу видно, что в пунктах 1 и 2 нужны реализации для int и double. Использование шаблона при вызове в таких случаях - опционально. Можно явно вызывать определённую реализацию, как в п.3.

Когда компилятор не знает какая реализация нужна, ты должен ему как бы намекнуть, что ты хочешь именно int. Так работают например QObject::findChild() и QVariant::value().

P.S. Читайте "C++ Templates: The Complete Guide. By David Vandevoorde, Nicolai M. Josuttis"
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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