一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

本文介绍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 };

 

posted on 2022-09-07 11:01  一杯清酒邀明月  阅读(989)  评论(0编辑  收藏  举报