Как узнать из слота, какой сигнал назвал этот слот?

Я имею в виду, если у меня много разных сигналов, которые подключены к одному и тому же слоту. Я видел этот вопрос но не могу понять ссылка в ответ. Можете ли вы привести простой пример?

7

Решение

Я думаю, что вы можете использовать этот метод:
[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()"
12

Другие решения


По вопросам рекламы [email protected]