本文介绍Qt的信号是否被连接了和信号槽之间的参数是否一致的判断方法。
1. 判断信号是否正确连接
通过判断connect的返回值是否为true。
1 bool ok = connect(this, SIGNAL(signal1()), this, SLOT(slot1()));
2 // 打印true
3 qDebug() << ok;
2. 判断信号是否被连接了
receivers返回的是该信号的连接数,如果大于0则为信号有连接。
- 原型:
[protected] int QObject::receivers(const char *signal) const
- 实现
bool isSignalConnected = this->receivers(SIGNAL(signal1())) > 0;
Qt5.0版本以上可以这样做:
1 QMetaMethod _signal1 = QMetaMethod::fromSignal(&Object::signal1);
2 isSignalConnected = this->isSignalConnected(_signal1);
3. 判断信号槽之间参数是否一致
- 原型:
1 [static] bool QMetaObject::checkConnectArgs(const char *signal, const char *method)
2 [static] bool QMetaObject::checkConnectArgs(const QMetaMethod &signal, const QMetaMethod &method)
- 实现:
1 bool ok = QMetaObject::checkConnectArgs(SIGNAL(signal2(int)), SLOT(slot2(int)));
2 qDebug() << ok;
4. 例子
1 class Object : public QObject
2 {
3 Q_OBJECT
4 public:
5 Object()
6 {
7 // 返回值可判断信号槽是否连接成功。
8 bool ok = connect(this, SIGNAL(signal1()), this, SLOT(slot1()));
9 // 打印true
10 qDebug() << ok;
11
12 // receivers返回的是该信号的连接数,如果大于0则为信号有连接。
13 bool isSignalConnected = this->receivers(SIGNAL(signal1())) > 0;
14 // 打印true
15 qDebug() << isSignalConnected;
16
17 QMetaMethod _signal1 = QMetaMethod::fromSignal(&Object::signal1);
18 isSignalConnected = this->isSignalConnected(_signal1);
19 // 打印true
20 qDebug() << isSignalConnected;
21
22 // 检查参数是否一致
23 ok = QMetaObject::checkConnectArgs(SIGNAL(signal2(int)), SLOT(slot2(int)));
24 // 打印true
25 qDebug() << ok;
26 }
27
28 signals:
29 void signal1();
30 void signal2(int);
31
32 public slots:
33 void slot1() { }
34 void slot2(int) { }
35 };
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
2020-09-07 OpenCV waitKey()