Russian Qt Forum

Qt => Общие вопросы => Тема начата: Zmeishe от Август 21, 2009, 11:19



Название: QObject и события childEvent
Отправлено: 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 создан в классе наследнике ?




Название: Re: QObject и события childEvent
Отправлено: Zmeishe от Август 21, 2009, 14:12
Странно всё это.

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

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

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

Как теперь узнать объект какого конкретного типа создался ?


Название: Re: QObject и события childEvent
Отправлено: Zmeishe от Август 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() )
и прицепиться к сигналам.


Название: Re: QObject и события childEvent
Отправлено: MoPDoBoPoT от Август 21, 2009, 15:56
Почему
Код:
QMyObject::QMyObject(QObject *parent): QObject( parent )
{
...
}
а не
Код:
QMyObject::QMyObject(QObject *parent): QMyBaseClass( parent )
{
...
}
коли QMyObject наследник от QMyBaseClass.


Название: Re: QObject и события childEvent
Отправлено: Igors от Август 21, 2009, 17:01
Почему не проще?

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

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

Но я удивляюсь как перекрытый virtual работал из QObject? Ведь когда конструируется QObject, QMyObject еще не создан, его конструктор не вызван и его virtual вызываться не должен


Название: Re: QObject и события childEvent
Отправлено: Zmeishe от Август 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`ов

Вот, собственно, и всё.