Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Узнать какой сигнал вызвал слот 
V
    Опции темы
borisbn
Дата 23.11.2011, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Привет.
Хочу узнать какой сигнал (не объект-сендер, а именно сигнал) вызвал слот.
Поясню: 
я коннекчу 2 сигнала одного объекта на один слот
Код

connect( &m_process, SIGNAL( readyReadStandardOutput() ), SLOT( onReadyRead() ) );
connect( &m_process, SIGNAL( readyReadStandardError() ), SLOT( onReadyRead() ) );

void CC::onReadyRead() {
    if ( вот_тут_хочу_узнать_кто_послал == readyReadStandardOutput() ) {
        setReadChannel( QProcess::StandardOutput );
    else
        setReadChannel( QProcess::StandardError );
    while ( m_process.canReadLine() ) {
        QString line = m_process.readLine()
        ...
    }
}

в onReadyRead() мне нужно узнать какой из сигналов дёрнул слот, чтобы сделать некоторые действия - а именно вызвать setReadChannel() с QProcess::StandardError или с QProcess::StandardOutput, а затем уже читать с помошью readLine().

Ессно, это можно легко решить законнектив каждый сигнал на отдельный слот, в каждом из которых сделать свой setReadChannel() и вызов общей для обоих случаев ф-ции чтения.
Код

connect( &m_process, SIGNAL( readyReadStandardOutput() ), SLOT( onReadyReadStd() ) );
connect( &m_process, SIGNAL( readyReadStandardError() ), SLOT( onReadyReadErr() ) );

void CC::onReadyReadStd() {
    setReadChannel( QProcess::StandardOutput );
    readFromProcess();
}
void CC::onReadyReadErr() {
    setReadChannel( QProcess::StandardError );
    readFromProcess();
}
void CC::readFromProcess() {
    while ( m_process.canReadLine() ) {
        QString line = m_process.readLine()
        ...
    }
}


Поэтому вопрос, скорее теоретический, чем жизненно необходимый.

Спасибо.

Это сообщение отредактировал(а) borisbn - 23.11.2011, 11:21


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


Эксперт
****


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

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



В отладчике это можно увидеть в
this->QObject->currentSender->signal
(в виде индекса в таблице сигналов)
Но открытого доступа к этому полю нет (по крайней мере, я не нашёл)
PM   Вверх
alexvs11
Дата 23.11.2011, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



почему не передавать в сигнал параметр?
PM MAIL   Вверх
borisbn
Дата 23.11.2011, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(alexvs11 @  23.11.2011,  14:39 Найти цитируемый пост)
почему не передавать в сигнал параметр?

потому, что это сигнал стандартного класса QProcess





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


Бывалый
*


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

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



типа такого:

Код

void CWidget::slotProg()
{
// номер потока
MyThread *t = (MyThread *)sender();
int x = t->getNumThread();  //номер потока
...
}


но тут надо имя метода...

Это сообщение отредактировал(а) Modul - 23.11.2011, 15:20
--------------------
I'll be back !
PM MAIL   Вверх
borisbn
Дата 23.11.2011, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



deleted, т.к. Modul уточнил smile


Это сообщение отредактировал(а) borisbn - 23.11.2011, 15:31


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


hell is here
**


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

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



borisbn, параметр слота можно забить через QSignalMapper
PM MAIL   Вверх
borisbn
Дата 23.11.2011, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



alexvs11, спасибо, ушёл курить QSignalMapper


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


Бывалый
*


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

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



может это поможет:

как идентифицировать сигнал


Код

void Test::testSlot()
{
    QObjectPrivate* sh = reinterpret_cast<QObjectPrivate*>(this->d_ptr);
    int idSignal = sh->currentSender->signal;
        QMetaMethod mm = (sender())->metaObject()->method( idSignal );
        const char *p = mm.signature();
    qDebug() << "Name of Signal" << p;
}


не проверял, но интересно!

--------------------
I'll be back !
PM MAIL   Вверх
borisbn
Дата 23.11.2011, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Modul, проверил. работает на версии 4.6.2. только чуть-чуть нужно подправить
Цитата
QObjectPrivate* sh = reinterpret_cast<QObjectPrivate*>(this->d_ptr.data());

.data() нужен потому, что тролли переделали хранение private-данных на QScopedPointer<QObjectData>, который может быть преобразован к QObjectData* только, если какая-нибудь ф-ция требует на вход QObjectData*, а reinterpret_cast не требует какого-то определённого указателя на вход.

В общем, этот способ меня в корне не устраивает, т.к. при смене версии Qt у меня программа в самом лучшем случае не скомпиляется, а в худшем - будет работать, и работать неправильно...


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


hell is here
**


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

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



Код

void slotClass::onSignal(QString value) { qDebug() << value; }

void signalClass::signal() { emit emptySignal(); }


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    slotClass slot;
    signalClass s1, s2;
    QSignalMapper mapper;
    QObject::connect(&s1, SIGNAL(emptySignal()), &mapper, SLOT(map()));
    QObject::connect(&s2, SIGNAL(emptySignal()), &mapper, SLOT(map()));
    mapper.setMapping(&s1, "1");
    mapper.setMapping(&s2, "2");
    QObject::connect(&mapper, SIGNAL(mapped(QString)), &slot, SLOT(onSignal(QString)));

    s1.signal();
    s2.signal();

    return a.exec();
}


по-простому
можно конечно посмотреть код QSignalMapper - как он определяет кто послал сигнал
PM MAIL   Вверх
borisbn
Дата 24.11.2011, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



alexvs11, 
Цитата(borisbn @  23.11.2011,  11:18 Найти цитируемый пост)
Хочу узнать какой сигнал (не объект-сендер, а именно сигнал) вызвал слот

для того, чтобы узнать сендера достаточно sender()


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


hell is here
**


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

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



borisbn, ну разным сигналам задаете разные параметры
делов то
PM MAIL   Вверх
borisbn
Дата 24.11.2011, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(alexvs11 @  24.11.2011,  20:21 Найти цитируемый пост)
разным сигналам задаете разные параметры

alexvs11, покажите, как в Вашем коде с QSignalMapper это сделать
подозреваю - никак


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


Эксперт
****


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

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



Можно сделать и через QSignalMapper - но в данном случае Ваш второй вариант из первого поста проще - фактически, при использовании QSignalMapper нужно в нём сделать то, что Вы сделали непосредственно в классе CC.

PM   Вверх
borisbn
Дата 25.11.2011, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(math64 @  25.11.2011,  07:49 Найти цитируемый пост)
Можно сделать и через QSignalMapper

разве что через разные QSignalMapper'ы...

Цитата(math64 @  25.11.2011,  07:49 Найти цитируемый пост)
при использовании QSignalMapper нужно в нём сделать то, что Вы сделали непосредственно в классе CC

дико извиняюсь, что туплю, но... как ?


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


Эксперт
****


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

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



Я имел в виду не использовать стандартный QSignalMapper, а написать собственный по его образу.  Если нужно применять несколько раз, это оправдано.
Или использовать два стандартных QSignalMapper, как Вы предложили.
PM   Вверх
borisbn
Дата 25.11.2011, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не, пожалуй, сегодня не мой день. Всё равно не пойму как это сделать. Если как-то так
Код

void CC::onReadyRead( int signalIdx ) {
    if ( signalIdx == 1 )
      ...
   дальше понятно
}

MySignalMapper m_mapper;

CC::СС() {
    connect( &m_process, SIGNAL( readyReadStandardOutput() ), &m_mapper, SLOT( onSignal1() ) );
    connect( &m_process, SIGNAL( readyReadStandardError() ), &m_mapper, SLOT( onSignal2() ) );
    connect( &m_mapper, SIGNAL( onSignal( int ) ), SLOT( onReadyRead( int ) ) );
}

class MySignalMapper {
public slots:
  void onSignal1() { emit onSignal( 1 ); }
  void onSignal2() { emit onSignal( 2 ); }
signals:
  void onSignal( int );

то это, действительно, не отличается от моего варианта №2, причём, при изменении количества сигналов или их сигнатуры, придётся менять этот "унивирсальный" MySignalMapper.

В общем, повторюсь: проблема уже решена, и это был чисто теоретический вопрос...
Закрываю.

Это сообщение отредактировал(а) borisbn - 25.11.2011, 13:17


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

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

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


 




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


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

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