Название: вопрос по findChild() Отправлено: yngwie от Июня 19, 2009, 22:32 Здравствуйте вот небольшой пример объектной иерархии:
Код: QObject *pobj1 = new QObject; для того чтобы найти объект по его имени нужно передать его имя в функцию 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, то компилятор сможет сам докумекать для какого типа нужно сгенерить реализацию. Например Код
Тут при явном вызове Код
сразу видно, что в пунктах 1 и 2 нужны реализации для int и double. Использование шаблона при вызове в таких случаях - опционально. Можно явно вызывать определённую реализацию, как в п.3. Когда компилятор не знает какая реализация нужна, ты должен ему как бы намекнуть, что ты хочешь именно int. Так работают например QObject::findChild() и QVariant::value(). P.S. Читайте "C++ Templates: The Complete Guide. By David Vandevoorde, Nicolai M. Josuttis" |