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


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

1 7

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()"