Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从插槽中找出调用此插槽的信号?_C++_Qt_Qtcore_Qt Signals_Qmetaobject - Fatal编程技术网

C++ 如何从插槽中找出调用此插槽的信号?

C++ 如何从插槽中找出调用此插槽的信号?,c++,qt,qtcore,qt-signals,qmetaobject,C++,Qt,Qtcore,Qt Signals,Qmetaobject,我的意思是,如果我有许多不同的信号连接到同一个插槽。我看到了这个问题,但在回答中不明白。你能给我举个简单的例子吗?我想你可以用这个方法: 从Qt文档: 返回调用当前执行插槽的信号的元方法索引,该插槽是sender()返回的类的成员。如果在由信号激活的插槽外部调用,则返回-1 对于具有默认参数的信号,此函数将始终返回包含所有参数的索引,而不管与connect()一起使用的是哪个参数。。例如,已销毁的信号(QObject*obj=0)将有两个不同的索引(带参数和不带参数),但此函数将始终返回带参数

我的意思是,如果我有许多不同的信号连接到同一个插槽。我看到了这个问题,但在回答中不明白。你能给我举个简单的例子吗?

我想你可以用这个方法:

从Qt文档:

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

对于具有默认参数的信号,此函数将始终返回包含所有参数的索引,而不管与connect()一起使用的是哪个参数。。例如,已销毁的信号(QObject*obj=0)将有两个不同的索引(带参数和不带参数),但此函数将始终返回带参数的索引。这不适用于使用不同参数重载信号的情况

警告:此函数违反了面向对象的模块化原则。但是,当许多信号连接到单个插槽时,访问信号索引可能会很有用

警告:当从与此对象的线程不同的线程通过Qt::DirectConnection调用插槽时,此函数的返回值无效。在这种情况下不要使用此函数

Qt4.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();
}
构建并运行 输出
谢谢。有没有办法用
QSignalMapper
做到这一点?Qt docs只有带有按钮的变体,但是如果我想将
QSignalMapper
QLineEdit
一起使用,我必须做什么?@9vashrotebal:当然,你也可以将QSignalMapper与QLineEdit一起使用,但如果没有我的解决方案,我不知道如何获取信号名,而不仅仅是发送方。
TEMPLATE = app
TARGET = main
QT = core
CONFIG += c++11
SOURCES += main.cpp
qmake && make && ./main
"timeout"
"timeout()"