从槽函数中如何找出是哪个信号调用了该槽函数?

9

我的意思是如果我有很多不同的信号连接到同一个插槽。我看到了这个问题,但不理解答案中的链接。你能给我一个简单的例子吗?

1个回答

15

我认为你可以使用这个方法:[protected] int QObject::​senderSignalIndex() const

从Qt文档中可以看到:

返回当前执行的槽所连接的信号的元方法索引,该信号是由sender()返回的类的成员。如果在未由信号激活的槽外调用,则返回-1。

对于具有默认参数的信号,此函数将始终返回具有所有参数的索引,而不管connect()中使用哪个参数。例如,信号destroyed(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()"

谢谢。使用QSignalMapper有没有办法做到这一点?Qt文档中只有与pushbutton相关的变量,但如果我想要将QSignalMapperQLineEdit一起使用,我该怎么做? - ratojakuf
@9vashrotebal:当然,您也可以在QLineEdit中使用QSignalMapper,但是如果没有我的解决方案,我不知道如何获取信号名称而不仅仅是发送方。 - László Papp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接