Kalombyr
@Kalombyr

Можно ли в Qt соединить сигналы с разными параметрами с одним единственным слотом?

Доброго дня!
Есть несколько сигналов с разными типами параметров и разным их числом.
Сами объявления сигналов изменять нет возможности.
Нужно сконнектить их всех с одним слотом, в котором можно было бы получить все эти параметры, как это можно (и можно ли) реализовать?

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

Пока что понял, что самое простое, что бы слот был вообще без параметров, тогда его можно соединить с любым сигналом. Через QObject::sender нашёл кто отправил сигнал. А вот как теперь получить параметры?

Если нельзя, то как бы изящнее обойти это ограничение, не создавая кучи слотов?
  • Вопрос задан
  • 642 просмотра
Решения вопроса 1
SerJook
@SerJook
кодер
У вас соединение только с помощью строк SIGNAL() SLOT()?

Вот вариант для нового способа соединения:
Если все параметры могут быть преобразованы в QVariant и используется С++11, можно попробовать как-то так:

signals:
    void someSignal1(QString a);
    void someSignal2(int a, QString b);
    void someSignal3(float a, int b, QString c);
...
   void someSlot(QVariant arg1,QVariant arg2, QVariant arg3);


и соединение сигналов и слотов:
connect(sender, &Sender::someSignal1, std::bind( &Receiver::someSlot, receiver, std::placeholders::_1, QVariant(), QVariant() ));
connect(sender, &Sender::someSignal2, std::bind( &Receiver::someSlot, receiver, std::placeholders::_1, std::placeholders::_2, QVariant()));
connect(sender, &Sender::someSignal3, std::bind( &Receiver::someSlot, receiver, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3 ));


Проще я не смог придумать
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы