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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QObject и события childEvent  (Прочитано 4850 раз)
Zmeishe
Гость
« : Август 21, 2009, 11:19 »

Linux
Qt 4.5.1

Есть класс QMyBaseClass наследник от QObject.
в нём перекрыта функция childEvent( QChildEvent *event )

В конструкторе этого класса создаётся объект, которому в качестве парента передаётся this.
Сразу, автоматически, отрабатывает функция
void QMyBaseClass::childEvent( QChildEvent *event )
{
   if( event->added() )
    ...
}

Есть класс QMyClass наследник от QMyBaseClass
В его конструкторе тоже создаётся два объекта, им тоже в качестве парента передаётся this.
/* У базового класса и у наследника this одинаковый, если кто не знает. */

Функция void QMyBaseClass::childEvent( QChildEvent *event ) НЕ отрабатывает.

но children() возвращает всех троих.

Почему в базовом классе не возникает событий childEvent, если child создан в классе наследнике ?


Записан
Zmeishe
Гость
« Ответ #1 : Август 21, 2009, 14:12 »

Странно всё это.

Закрыл Qt Creator
Завершил сеанс пользователя.
Через некоторое время залогинился снова - и всё заработало.

Возник новый вопрос.

Поскольку childEvent возникает чуть раньше чем сконструируется сам объект event->child(), то
qobject_cast<QMyObject*> ( event->child() ) всегда будет возвращать ноль.

Как теперь узнать объект какого конкретного типа создался ?
« Последнее редактирование: Август 21, 2009, 14:57 от Zmeishe » Записан
Zmeishe
Гость
« Ответ #2 : Август 21, 2009, 14:56 »

Жестоко, в смысле не по фэн шую, но решил.

QMyObject::QMyObject(QObject *parent): QObject( parent )
{
...
}

Заменил на

QMyObject::QMyObject(QObject *parent): QObject( 0 )
{
 setParent( parent );
 ...
}

После этого, когда в классе отрабатывает void QMyBaseClass::childEvent( QChildEvent *event )
можно спокойно вызвать
qobject_cast<QMyObject*> ( event->child() )
и прицепиться к сигналам.
Записан
MoPDoBoPoT
Гость
« Ответ #3 : Август 21, 2009, 15:56 »

Почему
Код:
QMyObject::QMyObject(QObject *parent): QObject( parent )
{
...
}
а не
Код:
QMyObject::QMyObject(QObject *parent): QMyBaseClass( parent )
{
...
}
коли QMyObject наследник от QMyBaseClass.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Август 21, 2009, 17:01 »

Почему не проще?

QMyObject::QMyObject(QObject *parent)
{
 setParent( parent );
 ...
}

Все базовые конструкторы вызовутся с parent = 0

Но я удивляюсь как перекрытый virtual работал из QObject? Ведь когда конструируется QObject, QMyObject еще не создан, его конструктор не вызван и его virtual вызываться не должен
Записан
Zmeishe
Гость
« Ответ #5 : Август 23, 2009, 08:24 »

Почему
Код:
QMyObject::QMyObject(QObject *parent): QObject( parent )
а не
QMyObject::QMyObject(QObject *parent): QMyBaseClass( parent )

коли QMyObject наследник от QMyBaseClass.
QMyObject НЕ наследник от QMyBaseClass, он наследник от QObject.


Чтобы было проще могу пояснить не абстрактно, а поконкретнее.

Есть свой собственный класс QMyModel - наследник от модели QAbstractItemModel, ну а QAbstractItemModel в итоге от QObject.
Есть другой собственный класс QBaseDataModule - базовый модуль данных, наследник от QObject

В программах используется модуль данных QDataModule, наследник от базового модуля данных.
Идея в том, чтобы в базовый модуль данных перенести код общий для всех своих программ и вынести всё это в библиотеку:
- когда в модуле данных создаются модели с парентом this - этого модуля данных,
я хочу чтобы в базовом модуле данных один из сигналов этих моделей прицеплялся к единому слоту базового модуля данных.
Для этого в базовом модуле данных обработчик
void QBaseDataModule::childEvent( QChildEvent *event )
должен уметь отличать детей (child`ов) через
qobject_cast<QMyModel*> ( event->child() )
но он этого не мог делать т.к. childEvent возникает во время отработки конструктора QObject, а до конструктора QMyModel дело ещё не дошло.
поэтому и пришлось сделать
QMyModel::QMyModel(..., QObject *parent): QAbstractItemModel(0)
{
 setParent( parent );
 ...
}

Теперь цель достигнута.
Когда создаются модели в
QDataModule::QDataModule(QObject *parent): QBaseDataModule( parent )
{
  myModel = new QMyModel(..., this);
}

базовый модуль данных в childEvent их уже может отличать от всех других QObject`ов

Вот, собственно, и всё.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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