Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Etud от Март 25, 2010, 11:21



Название: Передача данных в главный виджет
Отправлено: 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;
myw.show();

Кусочек бы кода !


Название: Re: Передача данных в главный виджет
Отправлено: Etud от Март 28, 2010, 01:55
Классика приведения:

Код:
CWidget *p = ((CWidget *)parentWidget());
p->resize(200,300);


Название: Re: Передача данных в главный виджет
Отправлено: Gorthauer от Март 29, 2010, 22:54
Классика приведения:

Код:
CWidget *p = ((CWidget *)parentWidget());
p->resize(200,300);
ССЗБ detected. Стреляйте в ноги где-нибудь в другом месте, и не учите новичков так делать. Сишные касты в С++ да ещё и в Qt это моветон.
Кстати, а чем плох static_cast? Проверяется всё ещё на этапе компиляции


Название: Re: Передача данных в главный виджет
Отправлено: Racheengel от Март 30, 2010, 11:50
ИМХО, лучше выделить в главном виджете структуру с параметрами, которые будут меняться дочерним виджетом. И при его (дочернем) создании передать ему поинтер на данную структуру. Таким образом можно организовать и двусторонний обмен.


Название: Re: Передача данных в главный виджет
Отправлено: SASA от Март 30, 2010, 14:39
Классика приведения:
Стреляйте в ноги где-нибудь в другом месте, и не учите новичков так делать.
;D ;D ;D ;D
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.