我的意思是,如果我有许多不同的信号连接到同一个插槽。我看到了这个问题,但无法理解答案中的链接。你能给我举个简单的例子吗?
问问题
4704 次
1 回答
13
我认为您可以使用此方法:
[protected] int QObject::senderSignalIndex() const
来自 Qt 文档:
返回调用当前执行 slot 的信号的元方法索引,它是 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();
}
主程序
TEMPLATE = app
TARGET = main
QT = core
CONFIG += c++11
SOURCES += main.cpp
构建并运行
qmake && make && ./main
输出
"timeout"
"timeout()"
于 2014-12-15T02:36:31.057 回答