Как узнать из слота, какой сигнал вызвал этот слот?
Я имею в виду, если у меня есть много различных сигналов, которые подключены к одному и тому же слоту. Я видел Этот вопрос, но не могу понять связь в ответе. Можете ли вы привести мне простой пример?
1 ответ:
Я думаю, что вы можете использовать этот метод:
[protected] int QObject::senderSignalIndex() const
Из документации Qt:
Вот небольшой пример, который я создал для вас, который демонстрирует, как это работает:Возвращает индекс мета-метода сигнала, вызвавшего текущий выполняющийся слот , который является членом класса, возвращаемого sender(). При вызове вне слота, активированного сигналом, возвращается значение -1.
Для сигналов с параметрами по умолчанию, Эта функция всегда будет возвращать индекс со всеми параметрами, независимо от того, который использовался с connect () . Например, уничтоженный сигнал (QObject * obj = 0) будет иметь два разных индекса (с параметром и без него), но эта функция всегда будет возвращать индекс с параметром. Это не относится к перегрузке сигналов с различными параметрами.
Предупреждение: данная функция нарушает объектно-ориентированный принцип модульности . Однако получение доступа к индексу сигнала может оказаться полезным, если к одному слоту подключено много сигналов.
Предупреждение: возвращаемое значение этой функции недопустимо, когда слот вызывается через Qt:: DirectConnection из потока, отличного от потока этого объекта. не используйте эту функцию в сценарии данного типа.
Эта функция была введена в Qt 4.8.#include <QTimer> #include <QMetaObject> #include <QMetaMethod> #include <QCoreApplication> #include <QDebug> #include <QObject> class Foo : public QObject { Q_OBJECT public slots: void mySlot() { QMetaMethod metaMethod = sender()->metaObject()->method(senderSignalIndex()); qDebug() << metaMethod.name(); qDebug() << metaMethod.methodSignature(); qApp->quit(); } }; #include "main.moc" int main(int argc, char **argv) { QCoreApplication coreApplication(argc, argv); QTimer timer; Foo foo; QObject::connect(&timer, &QTimer::timeout, &foo, &Foo::mySlot); timer.setSingleShot(true); timer.start(1000); return coreApplication.exec(); }
Main.pro
TEMPLATE = app TARGET = main QT = core CONFIG += c++11 SOURCES += main.cpp
Построить и запустить
qmake && make && ./main
Вывод
"timeout" "timeout()"