Название: 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 ) Название: 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 НЕ наследник от QMyBaseClass, он наследник от QObject.Код: QMyObject::QMyObject(QObject *parent): QObject( parent ) Чтобы было проще могу пояснить не абстрактно, а поконкретнее. Есть свой собственный класс 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`ов Вот, собственно, и всё. |