Поиск:

Ответ в темуСоздание новой темы Создание опроса
> слот с параметром-шаблоном 
:(
    Опции темы
kuvshinka
Дата 25.4.2012, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



Подскажите пож-та (пример объявления и описания) каким образом можно создать сигнал (соответственно и слот) с параметром, в качестве значения которого я могла бы передавать экземпляр какого-либо (т. е. произвольного) класса (просто достаточно много надо переслать данных из одного класса(ов) в другой и хочется сделать минимальное число коннектов - в идеале один-"универсальный")...

Это сообщение отредактировал(а) kuvshinka - 25.4.2012, 19:48
PM MAIL   Вверх
borisbn
Дата 25.4.2012, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



коротко - никак
signal/slot-система в Qt не предусматривает шаблонов Си++ в принципе


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 25.4.2012, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 7
Всего: 250



kuvshinka, QVariant..


Это сообщение отредактировал(а) mes - 25.4.2012, 22:46


--------------------
PM MAIL WWW   Вверх
kuvshinka
Дата 26.4.2012, 05:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



borisbn - под словом "шаблон" я имела ввиду скорее не С++-ный шаблон, а скорее название, подразумевающее под собой возможность задания в качестве параметра слота/сигнала значений разного "типа" (объекты разных классов)...
mes - подскажите пож-та на примере(объявление и описание сигнала и слота)!!!
PM MAIL   Вверх
math64
Дата 26.4.2012, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



вообще-то можно и с template:
Код

class AnyBase {
...
};
template<typename T>
class Any : public AnyBase {
...
private:
  T* m_t;
};
class MyObject : public Object {
Q_OBJECT
signals:
  void signal(AnyBase*);
public slots:
  void slor(AnyBase*);
};


PM   Вверх
kuvshinka
Дата 26.4.2012, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



math64: не совсем поняла Ваш пример: 
1. AnyBase  - это класс-отправитель сообщения(экземпляра класса) или кто ? если да, то что же получается: так как разных отправителей у меня много (с десяток), то все их мне надо перечислить в объявлении шаблона Any ? то есть ...public  AnyBase, klass1, klass2... 
2. зачем создавать T* m_t;?
поясните по-простому Ваш пример...

mes: подскажите пример с QVariant....
PM MAIL   Вверх
mes
Дата 26.4.2012, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 7
Всего: 250



Цитата(kuvshinka @  26.4.2012,  19:35 Найти цитируемый пост)
 подскажите пример с QVariant....

обычный сигнал, только в аргументе Вариант..
http://qt-project.org/doc/qt-4.8/QVariant.html

Вы лучше свою задачу опишите, тогда можно будет более точно  подсказать подходящее решение.. 




--------------------
PM MAIL WWW   Вверх
kuvshinka
Дата 26.4.2012, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



mes: задача следующая (просьба дать пример решения!!!):
Есть отдельный файл (хедер) с описанием классов M1, M2, M3
в MainClass создаются объекты классов A,B, и C... 
в классе А создаются объекты классов A1, A2, A3, A4, в классе В - объекты классов B1, B2...
Задача: допустим в классе A2 создаются объекты классов M1, M3, в разных местах А2-класса они заполняются данными и их надо поочередно отправить в класс C (слот)...понятно, что это можно сделать коннектом в MainClass, соединив сигнал из A2 со слотом класса С с параметром типа М1, а потом и с М3, но так как таких передач (допустим из B1 отослать M2 в класс C) достаточно много, то и коннектов будет много, а хотелось бы как-то это соптимизировать ...пункт назначения всегда один - слот класса С, но вот как его параметр сделать универсальным (экземпляром произвольного М-класса ( но их перечень я знаю))?
PM MAIL   Вверх
mes
Дата 26.4.2012, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 7
Всего: 250



и что это в итоге должно быть ?


--------------------
PM MAIL WWW   Вверх
baldina
Дата 26.4.2012, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: нет
Всего: 101



kuvshinka, "отправить в класс X" нельзя, можно отправить сообщение объекту типа Х. но это к слову...
mes прав: задачу Вы таки не описали.

но раз уж объект типа С (видимо посредством одной функции) умеет принимать объекты разных типов, то либо все эти типы наследуются от одного, и этот тип принимает объект С, либо С имеет несколько функций с разным типом параметров. И в любом случае С осведомлен об интерфейсе всех типов объектов, с которыми взаимодействует. так что вопрос про задачу остается актуальным smile

Это сообщение отредактировал(а) baldina - 26.4.2012, 22:56
PM MAIL   Вверх
kuvshinka
Дата 27.4.2012, 05:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



mes: что значит "что это в итоге должно быть"? надо осуществить передачу данных класса Мх из классов Ахх, Вхх в общий для них всех слот класса С...Писать для каждого конкретного Мх-сообщения свой коннект нежелательно - их будет достаточно много и отличаться они будут только отправителем и типом параметра(передаваемым объектом класса)... 
baldina - так я про это и спрашиваю как сделать так, чтобы один слот (класса С) умел бы принимать объекты разных типов, унаследовать все Мх-классы от одного нельзя по заданию, они все независимы друг от друга (но наверное можно сделать их какое-то перечисление или что-тло в этом роде), но мне как раз и не надо, чтобы  класс "С имел бы несколько функций с разным типом параметров" (в этом варианте все ясно - много коннектов под каждый объект класса Мх)
PM MAIL   Вверх
math64
Дата 27.4.2012, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Цитата(kuvshinka @  26.4.2012,  20:35 Найти цитируемый пост)
AnyBase  - это класс-отправитель сообщения(экземпляра класса) или кто ?

Это класс-обёртка, в который можно завенуть любой класс.
Если Выши классы унаследованы от одного класса (например QObject), то класс обёртка не нужен, передавайте в параметре сигнала QObject*
Цитата(mes @  26.4.2012,  21:29 Найти цитируемый пост)
обычный сигнал, только в аргументе Вариант..

На самом деле немного сложнее.
Код

class M1;
Q_DECLARE_METATYPE(M1*)
class M2;
Q_DECLARE_METATYPE(M2*)
class M3;
Q_DECLARE_METATYPE(M3*)
class A : public Object {
Q_OBJECT
signals:
  void signal(QVariant);
};
class C : public Object {
Q_OBJECT
public slots:
  void slot(QVariant);
};
void A::doEmit() {
  M1* m1 = new M1;
  QVariant v;
  v.setValue(M1);
  emit signal(v);
  delete M1;
}
void C::slot(QVariant v) {
  M1* m1 = v.value<M1*>();
  if (m1 != NULL) {
    ...
  }
}


PM   Вверх
mes
Дата 27.4.2012, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 7
Всего: 250



Цитата(kuvshinka @  27.4.2012,  04:36 Найти цитируемый пост)
 надо осуществить передачу данных класса Мх из классов Ахх, Вхх в общий для них всех слот класса С..

тогда и ответ такой же : приведите все Mx к полиморфному виду (в любой из вариаций : общий базовый класс, вариант , (сериализованная) строка и т.д. ) и передавайте..  Большей конкретики по озвученому заданию дать не представляется возможным .. Более того полагаю что ошибка проектирования закралась у Вас гораздо глубже, в той части что Вы по партизански скрываете..

Добавлено @ 11:41
Цитата(math64 @  27.4.2012,  07:37 Найти цитируемый пост)
На самом деле немного сложнее.

немножко сложнее сделать класс "запихиваемым" в Вариант, а не сделать сигнал  smile 
и плюс.. что то мне подсказывает, что задача тс решается гораздо проще, чем тс ее описывает..

Добавлено @ 11:46
Цитата(kuvshinka @  27.4.2012,  04:36 Найти цитируемый пост)
..Писать для каждого конкретного Мх-сообщения свой коннект нежелательно - их будет достаточно много и отличаться они будут только отправителем и типом параметра(передаваемым объектом класса)... 

так приведите М-сообщение к динамичному виду и дальше передавайте его как вздумается smile


Это сообщение отредактировал(а) mes - 27.4.2012, 11:49


--------------------
PM MAIL WWW   Вверх
baldina
Дата 27.4.2012, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: нет
Всего: 101



kuvshinka, один вопрос. Допустим объект класса С умеет получать в одной функции объекты разных типов, неважно как, но например посредством QVariant. Что дальше? В смысле, как объект С будет с ними работать? Еще точнее - что ему требуется делать с этими объектами?
Думаю, если Вы сможете ответить на этот вопрос, то ответа на вопрос "как именно" использовать QVariant не потребуется  smile 
PM MAIL   Вверх
baldina
Дата 27.4.2012, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: нет
Всего: 101



Цитата(kuvshinka @  25.4.2012,  19:47 Найти цитируемый пост)
просто достаточно много надо переслать данных из одного класса(ов) в другой и хочется сделать минимальное число коннектов - в идеале один-"универсальный"

прочитал еще раз - почудилась тень сериализации
все-таки я поддерживаю mes, попартизанили и хватит. расскажите нам все  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1376 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.