如何从插槽中找出哪个信号调用了此插槽
How to find out from the slot which signal has called this slot?
我的意思是如果我有许多不同的信号连接到同一个插槽。我看到了这个问题,但无法理解答案中的链接。你能给我举个简单的例子吗?
我认为您可以使用此方法: [protected] int QObject::senderSignalIndex() const
来自Qt文档:
返回调用当前执行槽的信号的元方法索引,该时隙是 sender(( 返回的类的成员。如果在信号激活的插槽外部调用,则返回 -1。
对于具有默认参数的信号,此函数将始终返回包含所有参数的索引,无论哪个参数与 connect(( 一起使用。例如,销毁的信号(QObject *obj = 0(将有两个不同的索引(带参数和不带参数(,但此函数将始终返回带有参数的索引。当具有不同参数的信号过载时,这不适用。
警告:此函数违反了面向对象的模块化原则。但是,当许多信号连接到单个插槽时,访问信号索引可能很有用。
警告:当通过 Qt::D irectConnection 从与此对象的线程不同的线程调用插槽时,此函数的返回值无效。请勿在此类方案中使用此函数。
这个函数是在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()"
相关文章:
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 升压信号2将插槽传递到成员功能以断开连接
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- C++ 信号和插槽不工作:插槽不响应事件
- QObject::连接无法将信号连接到*this*对象的插槽
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 控制带有信号/插槽的Qt QML滑动视图
- Qt 信号/插槽问题
- QT5 信号不会激活插槽内的功能
- Qt5:连接:如果插槽的参数少于信号,如何使用"连接"
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- C++Qt信号和插槽
- Qt moveToThread,带有参数的信号/插槽
- 当再次触发信号时,从Qt插槽执行的功能被第二次调用时会发生什么?
- 从 QWidgetList 访问 QWidget 子插槽/信号 (QList<QWidget*>)
- 两个对象QT之间的示例插槽/信号
- QT对象::连接:没有此类插槽信号到线程插槽
- Qt QAxWidget - WebBrowser手动设置插槽/信号
- 没有这样的插槽/信号(Qt)