Russian Qt Forum

Qt => Общие вопросы => Тема начата: PulSar.CE3194694 от Август 13, 2010, 21:27



Название: Два сигнала в один слот
Отправлено: PulSar.CE3194694 от Август 13, 2010, 21:27
Добрый день!
Вопрос такой: можно отправить два и более сигналов в один слот? Например, когда оба сигнала передают передают какие-нибудь значения.


Название: Re: Два сигнала в один слот
Отправлено: SimpleSunny от Август 13, 2010, 22:31
Соединить необходимое количество сигналов с одним слотом.


Название: Re: Два сигнала в один слот
Отправлено: lit-uriy от Август 13, 2010, 22:52
>>Вопрос такой: можно отправить два и более сигналов в один слот?
Ответ: да


Название: Re: Два сигнала в один слот
Отправлено: PulSar.CE3194694 от Август 17, 2010, 13:56
Хорошо, вот слот: void MainWindow::MySlot(int Q, double W, bool E) Кроме сигнала MySignal(Q, W, E) хочу, например, в него послать эти: MySignal1(QLine line) и MySignal2(QMatrix matrix, double *QWERTY).  Как это сделать? Если просто их сконектить со слотом, то вылезет ошибка.


Название: Re: Два сигнала в один слот
Отправлено: Anarion от Август 17, 2010, 14:08
А Вы различные по типу и количеству параметры передаете.


Название: Re: Два сигнала в один слот
Отправлено: labview от Август 17, 2010, 14:09
Либо используй несколько слотов, на каждый тип данных, либо один слот, но тогда нужно передавать "неопределённый" тип данных, например Byte Array, который в дальнейшем в слоте преобразуется в нужный тип данных с помощью кастинга. О типе данных тоже нужно сообщать слоту с помощью еньюмератора например.
Могу ошибатьса, я сам новичёк...


Название: Re: Два сигнала в один слот
Отправлено: Anarion от Август 17, 2010, 14:12
Ну если уж прямо нужно все сигналы в один этот слот, то сделай для слота все возможные параметры, которые требуется получить от всех сигналов, а при эмите сигналов ненужные в данном контретном случае параметры отправляй нулевыми. Но только потом придется разбираться, сигнал с какими параметрами пришел. Так что все таки лучше на каждый набор параметров свой слот.


Название: Re: Два сигнала в один слот
Отправлено: labview от Август 23, 2010, 17:47
Подскажите пожалуйста какой тип данных можно использовать для передачи любых данных. Подойдёт ли QVariant? Или стоит попробовать QByteArray? Может быть лучше взять union?


Название: Re: Два сигнала в один слот
Отправлено: BRE от Август 23, 2010, 17:49
Подскажите пожалуйста какой тип данных можно использовать для передачи любых данных. Подойдёт ли QVariant? Или стоит попробовать QByteArray? Может быть лучше взять union?
Ты по подробней расскажи про данные.
А вообще данные можно даже в текстовом виде передавать.


Название: Re: Два сигнала в один слот
Отправлено: labview от Август 23, 2010, 18:04
Данные разные, нужен какой нибудь универсальный тип, который может содержать любые структуры. Текстовый тип (всмысле ASCII) не интересует, т.к. преобразование в текст лишнее. Думаю скорее всего использовать QByteArray и длину массива (содержимого) вписывать в первые два байта.


Название: Re: Два сигнала в один слот
Отправлено: BRE от Август 23, 2010, 18:07
Думаю скорее всего использовать QByteArray и длину массива (содержимого) вписывать в первые два байта.
Ну если разбор бинарных данных тебя интересует больше текстовых, тогда можно и его.
Только длину можно не вписывать, приемник получит этот массив со всеми его атрибутами, т.е. QByteArray::size() будет возвращать количество байт в массиве.


Название: Re: Два сигнала в один слот
Отправлено: labview от Август 23, 2010, 18:09
Или всё же QVariant с метатипом будет удобнее?


Название: Re: Два сигнала в один слот
Отправлено: BRE от Август 23, 2010, 18:11
Или всё же QVariant с метатипом будет удобнее?
Ты структуры хочешь передавать или это могут быть данные переменной длины или ...


Название: Re: Два сигнала в один слот
Отправлено: labview от Август 23, 2010, 18:12
В основном структуры, состоящие из 1-5 элементов. Среди них конечно может встретиться например и QString, который конечно имеет свою длину.


Название: Re: Два сигнала в один слот
Отправлено: BRE от Август 23, 2010, 18:20
В основном структуры, состоящие из 1-5 элементов. Среди них конечно может встретиться например и QString, который конечно имеет свою длину.
Для структур можно и QVariant использовать.

Только, IMHO, куда-то ты не туда пошел. Вот меня слот который будет один на всю программу, получать любые данные и исполнять все возможное, честно говоря пугает.
Хорошо ли ты все спроектировал?


Название: Re: Два сигнала в один слот
Отправлено: labview от Август 23, 2010, 18:25
Речь идёт об этом:
http://www.prog.org.ru/topic_14426_0.html

Пишу здесь, т.к. система схожа с системой сигналов и слотов. А что страшного в сериализации? Я подкреплю передаваемые типы данных тайпдефами, и должно быть чики чики.


Название: Re: Два сигнала в один слот
Отправлено: BRE от Август 23, 2010, 18:37
Ааа, ты от сенсоров хочешь все данные на один слот завести?
Я думал ты хочешь сделать слот, который будет обслуживать совершенно разные сигналы.


Название: Re: Два сигнала в один слот
Отправлено: labview от Август 23, 2010, 18:39
Я думал ты хочешь сделать слот, который будет обслуживать совершенно разные сигналы.

Именно это, а потом свитчем обрабатывать.

ЗЫ эта штука называется Queued State Machine и довольно широко используется.


Название: Re: Два сигнала в один слот
Отправлено: BRE от Август 23, 2010, 18:42
Именно это, а потом свитчем обрабатывать.

ЗЫ эта штука называется Queued State Machine и довольно широко используется.
Хм, но сигналы то хоть будут однотипные? Или он будет обслуживать сенсоры, пользовательский ввод, таймеры, сеть и т.д.  :)


Название: Re: Два сигнала в один слот
Отправлено: labview от Август 23, 2010, 18:43
На определённый тип задач свой поток, у каждого потока один слот. Задания разнотипные.

Пример (образно):

поток TCP_Port.
сигналы (задания) + параметры:

OpenPort(IPAdress, PortNr)
ClosePort()
Read(NrOfBytes)
Write(ByteArray)

Вот параметры я и хочу запихать в структуры, а какие именно параметры (структура для декодирования) зависит от типа сигнала (номера задания).