Поиск:

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

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

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


 




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


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

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