| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Узнать какой сигнал вызвал слот |
| Автор: borisbn 23.11.2011, 11:18 | ||||
| Привет. Хочу узнать какой сигнал (не объект-сендер, а именно сигнал) вызвал слот. Поясню: я коннекчу 2 сигнала одного объекта на один слот
в onReadyRead() мне нужно узнать какой из сигналов дёрнул слот, чтобы сделать некоторые действия - а именно вызвать setReadChannel() с QProcess::StandardError или с QProcess::StandardOutput, а затем уже читать с помошью readLine(). Ессно, это можно легко решить законнектив каждый сигнал на отдельный слот, в каждом из которых сделать свой setReadChannel() и вызов общей для обоих случаев ф-ции чтения.
Поэтому вопрос, скорее теоретический, чем жизненно необходимый. Спасибо. |
| Автор: math64 23.11.2011, 14:31 |
| В отладчике это можно увидеть в this->QObject->currentSender->signal (в виде индекса в таблице сигналов) Но открытого доступа к этому полю нет (по крайней мере, я не нашёл) |
| Автор: alexvs11 23.11.2011, 14:39 |
| почему не передавать в сигнал параметр? |
| Автор: borisbn 23.11.2011, 15:07 |
потому, что это сигнал стандартного класса QProcess |
| Автор: Modul 23.11.2011, 15:15 | ||
типа такого:
но тут надо имя метода... |
| Автор: borisbn 23.11.2011, 15:18 |
| deleted, т.к. Modul уточнил |
| Автор: alexvs11 23.11.2011, 15:43 |
| borisbn, параметр слота можно забить через QSignalMapper |
| Автор: borisbn 23.11.2011, 15:47 |
| alexvs11, спасибо, ушёл курить QSignalMapper |
| Автор: Modul 23.11.2011, 15:47 | ||
| может это поможет: http://www.forum.crossplatform.ru/lofiversion/index.php/t2021.html
не проверял, но интересно! |
| Автор: borisbn 23.11.2011, 16:09 | ||
Modul, проверил. работает на версии 4.6.2. только чуть-чуть нужно подправить
.data() нужен потому, что тролли переделали хранение private-данных на QScopedPointer<QObjectData>, который может быть преобразован к QObjectData* только, если какая-нибудь ф-ция требует на вход QObjectData*, а reinterpret_cast не требует какого-то определённого указателя на вход. В общем, этот способ меня в корне не устраивает, т.к. при смене версии Qt у меня программа в самом лучшем случае не скомпиляется, а в худшем - будет работать, и работать неправильно... |
| Автор: alexvs11 23.11.2011, 20:43 | ||
по-простому можно конечно посмотреть код QSignalMapper - как он определяет кто послал сигнал |
| Автор: alexvs11 24.11.2011, 20:21 |
| borisbn, ну разным сигналам задаете разные параметры делов то |
| Автор: borisbn 24.11.2011, 20:59 |
alexvs11, покажите, как в Вашем коде с QSignalMapper это сделать подозреваю - никак |
| Автор: math64 25.11.2011, 07:49 |
| Можно сделать и через QSignalMapper - но в данном случае Ваш второй вариант из первого поста проще - фактически, при использовании QSignalMapper нужно в нём сделать то, что Вы сделали непосредственно в классе CC. |
| Автор: borisbn 25.11.2011, 08:33 | ||
разве что через разные QSignalMapper'ы...
дико извиняюсь, что туплю, но... как ? |
| Автор: math64 25.11.2011, 10:52 |
| Я имел в виду не использовать стандартный QSignalMapper, а написать собственный по его образу. Если нужно применять несколько раз, это оправдано. Или использовать два стандартных QSignalMapper, как Вы предложили. |
| Автор: borisbn 25.11.2011, 13:13 | ||
Не, пожалуй, сегодня не мой день. Всё равно не пойму как это сделать. Если как-то так
то это, действительно, не отличается от моего варианта №2, причём, при изменении количества сигналов или их сигнатуры, придётся менять этот "унивирсальный" MySignalMapper. В общем, повторюсь: проблема уже решена, и это был чисто теоретический вопрос... Закрываю. |