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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача данных в главный виджет  (Прочитано 9413 раз)
Etud
Гость
« : Март 25, 2010, 11:21 »

Привет !

Возник интересный вопрос:
 Как данные передать из виджета в главный виджет ?

Но без использования сигналов и слотов.

Пока получилось передать данные из главного виджета в дочерний через указатель.
НАДО НАОБОРОТ !
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Март 25, 2010, 11:32 »

Вообще-то Qt и его виджеты здесь не причём. Улыбающийся

Кто мешает держать в свойствах дочерних объектов указатель на родительский объект?


Записан

Qt 5.11/4.8.7 (X11/Win)
Rcus
Гость
« Ответ #2 : Март 25, 2010, 12:12 »

Без сигналов и слотов есть parentWidget() и на выбор static_cast<SomeType*>() или в стиле Smalltalk - sendEvent
Записан
whirlwind
Гость
« Ответ #3 : Март 25, 2010, 14:45 »

Без сигналов и слотов есть parentWidget() и на выбор static_cast<SomeType*>() или в стиле Smalltalk - sendEvent
идеологически правильнее было бы qobject_cast, или хотя бы dynamic_cast
Записан
Rcus
Гость
« Ответ #4 : Март 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);
}
Множественное наследование не использую, потому этого хватает.
Записан
Etud
Гость
« Ответ #5 : Март 26, 2010, 09:42 »

Цитировать
Без сигналов и слотов есть parentWidget() и на выбор static_cast<SomeType*>()

С методом parentWidget() ясно. Он возвращает родительский класс.

Дальше не понятно.
Как обратиться в объекту главного виджета, чтобы изменить label например.

в функции main
Код:
MyWidget myw;
myw.show();

Кусочек бы кода !
Записан
Etud
Гость
« Ответ #6 : Март 28, 2010, 01:55 »

Классика приведения:

Код:
CWidget *p = ((CWidget *)parentWidget());
p->resize(200,300);
Записан
Gorthauer
Гость
« Ответ #7 : Март 29, 2010, 22:54 »

Классика приведения:

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

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #8 : Март 30, 2010, 11:50 »

ИМХО, лучше выделить в главном виджете структуру с параметрами, которые будут меняться дочерним виджетом. И при его (дочернем) создании передать ему поинтер на данную структуру. Таким образом можно организовать и двусторонний обмен.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
SASA
Гость
« Ответ #9 : Март 30, 2010, 14:39 »

Классика приведения:
Стреляйте в ноги где-нибудь в другом месте, и не учите новичков так делать.
Смеющийся Смеющийся Смеющийся Смеющийся
Rcus, а зачем в случае с const делать static_cast?
Записан
Rcus
Гость
« Ответ #10 : Март 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.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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