Название: Передача данных в главный виджет Отправлено: Etud от Март 25, 2010, 11:21 Привет !
Возник интересный вопрос: Как данные передать из виджета в главный виджет ? Но без использования сигналов и слотов. Пока получилось передать данные из главного виджета в дочерний через указатель. НАДО НАОБОРОТ ! Название: Re: Передача данных в главный виджет Отправлено: GreatSnake от Март 25, 2010, 11:32 Вообще-то Qt и его виджеты здесь не причём. :)
Кто мешает держать в свойствах дочерних объектов указатель на родительский объект? Название: Re: Передача данных в главный виджет Отправлено: Rcus от Март 25, 2010, 12:12 Без сигналов и слотов есть parentWidget() и на выбор static_cast<SomeType*>() или в стиле Smalltalk - sendEvent
Название: Re: Передача данных в главный виджет Отправлено: whirlwind от Март 25, 2010, 14:45 Без сигналов и слотов есть parentWidget() и на выбор static_cast<SomeType*>() или в стиле Smalltalk - sendEvent идеологически правильнее было бы qobject_cast, или хотя бы dynamic_castНазвание: Re: Передача данных в главный виджет Отправлено: Rcus от Март 25, 2010, 16:16 /*shrugs*/ Ну получите вы 0 указатель и что дальше будете с ним делать? У меня для таких случаев есть
Цитировать template<class T> inline T rzobject_cast(QObject *o) Множественное наследование не использую, потому этого хватает.{ Q_ASSERT(qobject_cast<T>(o)); return static_cast<T>(o); } template<class T> inline T rzobject_cast(const QObject *o) { Q_ASSERT(qobject_cast<T>(o)); return static_cast<T>(o); } Название: Re: Передача данных в главный виджет Отправлено: Etud от Март 26, 2010, 09:42 Цитировать Без сигналов и слотов есть parentWidget() и на выбор static_cast<SomeType*>() С методом parentWidget() ясно. Он возвращает родительский класс. Дальше не понятно. Как обратиться в объекту главного виджета, чтобы изменить label например. в функции main Код: MyWidget myw; Кусочек бы кода ! Название: Re: Передача данных в главный виджет Отправлено: Etud от Март 28, 2010, 01:55 Классика приведения:
Код: CWidget *p = ((CWidget *)parentWidget()); Название: Re: Передача данных в главный виджет Отправлено: Gorthauer от Март 29, 2010, 22:54 Классика приведения: ССЗБ detected. Стреляйте в ноги где-нибудь в другом месте, и не учите новичков так делать. Сишные касты в С++ да ещё и в Qt это моветон.Код: CWidget *p = ((CWidget *)parentWidget()); Кстати, а чем плох static_cast? Проверяется всё ещё на этапе компиляции Название: Re: Передача данных в главный виджет Отправлено: Racheengel от Март 30, 2010, 11:50 ИМХО, лучше выделить в главном виджете структуру с параметрами, которые будут меняться дочерним виджетом. И при его (дочернем) создании передать ему поинтер на данную структуру. Таким образом можно организовать и двусторонний обмен.
Название: Re: Передача данных в главный виджет Отправлено: SASA от Март 30, 2010, 14:39 Классика приведения: Стреляйте в ноги где-нибудь в другом месте, и не учите новичков так делать. Rcus, а зачем в случае с const делать static_cast? Название: Re: Передача данных в главный виджет Отправлено: Rcus от Март 30, 2010, 16:17 Rcus, а зачем в случае с const делать static_cast? Перегрузка для const QObject* нужна для полного набора. Вдруг будет указатель на константный объект, и нужно вызвать константный метод из подкласса? На самом деле у меня на 18k LoC всего 10 rzobject_cast, 22 qobject_cast, 21 static_cast и 4 qstyleoption_cast. Приведение типов для const T* используется только в случае qstyleoption_cast. |