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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: сигнатуры сигналов/слотов в метаметоде и SIGNAL/SLOT макросы  (Прочитано 9201 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Июнь 13, 2011, 22:08 »

насколько гарантировано их совпадение?

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

в Qt 4.7 нет нативного способа проверить есть ли соединение между двумя QMetaMethod, входящими в конкретные QMetaObject (увы... увы...) - есть два способа это сделать

1) отслеживать подключения в методе QObject::connectNotify
2) проверять отключением, и если disconnect вернул true, то подключать заново

1й способ выглядит более правильным, но очень громоздким, фактически придется дублировать всю информацию о соединениях сигналов и слотов, правда только о тех, которые нужны

2й способ выглядит хаком, но очень простой и не требует хранения дополнительной информации, правда он возможен только если в connect( object, SIGNAL(somesignal(int,float))... соединялке передается гарантированно тоже самое, что получается от object->metaObject()->method( i /*гарантирует верный метод по индексу*/).signature(), которая возвращает в данном случае const char* с содержимым "somesignal(int,float)"

иначе говоря, есть ли гарантия, что если было сделано однажды (предположим сигнал и слот у объектов единственные)

Код:
connect( object1, SIGNAL(somesignal(float)), object2, SLOT(someslot(float)));
и потом делается
Код:
disconnect( object1, object1->metaObject()->method(0).signature(), object2, object2->metaObject()->method(0).signature() );
то будут разомкнуты только и исключительно те же сигнал и слот, что были соединены?
« Последнее редактирование: Июнь 13, 2011, 22:20 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Июнь 13, 2011, 23:09 »

Ви таки извгащенец.
Не проще самому эмулировать сигналы/слоты через invokeMethod? Я делал именно так.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Июнь 13, 2011, 23:47 »

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

то есть, скорее извращение - делать дубль того механизма, который уже есть и работает
Записан

2^7-1 == 127, задумайтесь...
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Июнь 14, 2011, 00:13 »

Ну да, гораздо проще использовать сигналы слоты для того, для чего он не предназначены.
и инвок метод тоже тред сэйв да будет известно.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #4 : Июнь 14, 2011, 01:03 »

не проще, поскольку сигналы-слоты сделаны с учетом распараллеливания (разные способы доставки), а оно будет, значит в своем механизме тоже придется это делать
QMetaObject::invokeMethod принимает такой же параметр Qt::ConnectionType type, что и подкючение, что и коннект, т.е. хотите - прямой вызов, хотите - через сообщения, хотите - автоматически.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #5 : Июнь 14, 2011, 05:25 »

Цитировать
использовать сигналы слоты для того, для чего он не предназначены

чево??? а для чего они предназначены? ну-ка, ну-ка...  Смеющийся

Цитировать
QMetaObject::invokeMethod принимает такой же параметр Qt::ConnectionType

да при чем тут вообще invokeMethod?... это более низкого уровня механизм, который само по себе мою задачу не решает (сигнал-слоты через него наверняка и работают), значит мне не подходит, а механизм сигналов-слотов подходит, раз он делает ровно то, что мне нужно, значит он для этого и предназначен...

мне надо только иметь возможность наружными по отношению к объектам средствами иметь возможность динамически менять соединения сигналов и слотов - а раз есть connect и disconnect, значит все пучком, не хватает только areconnected и whereconnected

и вообще - если у кого есть что ответить по сути первого сообщения, просьба ответить, а не уводить в сторону, мне это не требуется
« Последнее редактирование: Июнь 14, 2011, 05:43 от Гурман » Записан

2^7-1 == 127, задумайтесь...
SASA
Гость
« Ответ #6 : Июнь 14, 2011, 10:56 »

Я бы сделал первым способом.
Отнаследовался бы от QObject, завёл бы в этом классе словарик типа QMap<QString, QList<QPointer<QObjeсt> > >. Т.е. на каждый слот хранить список подключенных и менять его в нотифае. + пару методов получения инфы из этого словаря. А все остальные классы отнаследовать от этого класса. Весь механизм в одном месте. Не больше 100 строчек кода.

Объекты конектятся на уровне Qobject, а не QMetaObject. QMetaObject - набор статичной информации, поэтому механизм надо реализовывать в наследнике QObject.
« Последнее редактирование: Июнь 14, 2011, 10:59 от SASA » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Июнь 14, 2011, 12:06 »

Может кто не заметил
Код
C++ (Qt)
int QObject::receivers ( const char * signal ) const [protected]
Цитата: assistant
Returns the number of receivers connected to the signal.
Записан

Qt 5.11/4.8.7 (X11/Win)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #8 : Июнь 14, 2011, 12:48 »

заметил, только толку от этого никакого нет, это только количество приемников, но не сами приемники, и нет возможности узнать ни количество передатчиков, ни сами передатчики
Записан

2^7-1 == 127, задумайтесь...
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Июнь 14, 2011, 13:17 »

заметил, только толку от этого никакого нет, это только количество приемников, но не сами приемники, и нет возможности узнать ни количество передатчиков, ни сами передатчики
Спасибо троллям за заботу о нас Грустный
Тут, имхо, 2 варианта:
  • пиши свой connect()
  • используй QObjectPrivate
Записан

Qt 5.11/4.8.7 (X11/Win)
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #10 : Июнь 14, 2011, 13:34 »

Цитировать
вопрос возник вот из-за чего: нужно динамически иметь возможность менять подключение сигналов и слотов, причем вручную, для чего нужно знать, какие сигналы подключены к конкретному слоту, и к каким слотам подключен конкретный сигнал (чтобы показывать соединение на экране и иметь возможность его менять)
ИМХО, но слот - он сам по себе и он не обязан знать какие сигналы его вызывают. Это, я бы сказал, несколько противоречит самому патерну механизма сигнал-слот.
С другой стороны, сигнал (он же передатчик, он же sender) вполне может предоставить информацию о том к каким слотам подключён (например вернуть список указателей на методы (слоты)).

Может boost::signals  для вас будет более гибким в этом отношении..
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #11 : Июнь 14, 2011, 14:00 »

Цитировать
лот - он сам по себе и он не обязан знать какие сигналы его вызывают

тем не менее, sender-а узнать легко, правда, увы, только после того, как сигнал пришел

Цитировать
С другой стороны, сигнал (он же передатчик, он же sender) вполне может предоставить информацию о том к каким слотам подключён (например вернуть список указателей на методы (слоты)).

может... я этого ждал где-то с Qt версии 2.х... пока не дождался, приходится корячится

Цитировать
Может boost::signals  для вас будет более гибким в этом отношении..

неее... нельзя смешивать кофе с чаем, невкусно...

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

« Последнее редактирование: Июнь 14, 2011, 14:01 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #12 : Июнь 14, 2011, 14:28 »

ВОТ ЗАРАЗА! то, что дают макросы SIGNAL и SLOT, отличается от сигнатур... макросы добавляют перед именем метода целое число (по-моему, это порядковый номер в таблице методов), а сигнатура возвращает просто имя с параметрами

не, можно конечно и подстроку в сигнатуре поискать... а, не! все гораздо проще

но похоже придется все-таки перейти от 2-го способа, который я уже практически сделал, к первому... изменений не много будет
« Последнее редактирование: Июнь 14, 2011, 14:47 от Гурман » Записан

2^7-1 == 127, задумайтесь...
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #13 : Июнь 14, 2011, 14:58 »

ВОТ ЗАРАЗА! то, что дают макросы SIGNAL и SLOT, отличается от сигнатур... макросы добавляют перед именем метода целое число (по-моему, это порядковый номер в таблице методов), а сигнатура возвращает просто имя с параметрами
это тип METHOD/SLOT/SIGNAL, потому можешь смело делать +1
Записан

Qt 5.11/4.8.7 (X11/Win)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #14 : Июнь 14, 2011, 15:29 »

да, я это вспомнил...
Записан

2^7-1 == 127, задумайтесь...
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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