Russian Qt Forum

Qt => Общие вопросы => Тема начата: yngwie от Июнь 19, 2009, 22:32



Название: вопрос по findChild()
Отправлено: 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*>, и зачем это нужно?



Название: Re: вопрос по findChild()
Отправлено: spectre71 от Июнь 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.


Название: Re: вопрос по findChild()
Отправлено: yngwie от Июнь 19, 2009, 23:31
т.е findChildfindChild<QObject*> означает вернуть указатель и привести его к QObject* так?
<QObject*> это что-то типа макроса?


Название: Re: вопрос по findChild()
Отправлено: ритт от Июнь 20, 2009, 00:09
гуглить на тему шаблонов в плюсах


Название: Re: вопрос по findChild()
Отправлено: spectre71 от Июнь 20, 2009, 00:37
гуглить на тему шаблонов в плюсах

Ну не сталкивался человек с шаблонами ;), пора изучать. :o




Название: Re: вопрос по findChild()
Отправлено: Alex Custov от Июнь 20, 2009, 02:11
т.е findChildfindChild<QObject*> означает вернуть указатель и привести его к QObject* так?
<QObject*> это что-то типа макроса?

google => C++ member template functions


Название: Re: вопрос по findChild()
Отправлено: yngwie от Июнь 20, 2009, 20:24
про шаблоны вроде разобрался. раз прототип этой функции такой:
Код:
T QObject::findChild ( const QString & name = QString() ) const

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

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

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

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


Название: Re: вопрос по findChild()
Отправлено: Alex Custov от Июнь 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"