本文介绍Qt的信号是否被连接了和信号槽之间的参数是否一致的判断方法。
1. 判断信号是否正确连接
通过判断connect的返回值是否为true。
bool ok = connect(this, SIGNAL(signal1()), this, SLOT(slot1()));
// 打印true
qDebug() << ok;
2. 判断信号是否被连接了
receivers返回的是该信号的连接数,如果大于0则为信号有连接。
- 原型:
[protected] int QObject::receivers(const char *signal) const
- 实现
bool isSignalConnected = this->receivers(SIGNAL(signal1())) > 0;
Qt5.0版本以上可以这样做:
QMetaMethod _signal1 = QMetaMethod::fromSignal(&Object::signal1);
isSignalConnected = this->isSignalConnected(_signal1);
3. 判断信号槽之间参数是否一致
- 原型:
[static] bool QMetaObject::checkConnectArgs(const char *signal, const char *method)
[static] bool QMetaObject::checkConnectArgs(const QMetaMethod &signal, const QMetaMethod &method)
- 实现:
bool ok = QMetaObject::checkConnectArgs(SIGNAL(signal2(int)), SLOT(slot2(int)));
qDebug() << ok;
4. 例子
class Object : public QObject
{
Q_OBJECT
public:
Object()
{
// 返回值可判断信号槽是否连接成功。
bool ok = connect(this, SIGNAL(signal1()), this, SLOT(slot1()));
// 打印true
qDebug() << ok;
// receivers返回的是该信号的连接数,如果大于0则为信号有连接。
bool isSignalConnected = this->receivers(SIGNAL(signal1())) > 0;
// 打印true
qDebug() << isSignalConnected;
QMetaMethod _signal1 = QMetaMethod::fromSignal(&Object::signal1);
isSignalConnected = this->isSignalConnected(_signal1);
// 打印true
qDebug() << isSignalConnected;
// 检查参数是否一致
ok = QMetaObject::checkConnectArgs(SIGNAL(signal2(int)), SLOT(slot2(int)));
// 打印true
qDebug() << ok;
}
signals:
void signal1();
void signal2(int);
public slots:
void slot1() { }
void slot2(int) { }
};