Я имею в виду, если у меня много разных сигналов, которые подключены к одному и тому же слоту. Я видел этот вопрос но не могу понять ссылка в ответ. Можете ли вы привести простой пример?
Я думаю, что вы можете использовать этот метод:
[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();
}
TEMPLATE = app
TARGET = main
QT = core
CONFIG += c++11
SOURCES += main.cpp
qmake && make && ./main
"timeout""timeout()"