QObject::disconnect(sender, signal, receiver, method)
这三个参数signal, receiver, method都可以为0,为0时代表“任意”(所有)信号槽
disconnect(sender, 0, 0, 0) // 取消sender所有信号连接所有接受者的所有槽函数
disconnect( s, 0, r1, 0 ) //
disconnect( s, SIGNAL(signal1()), r1, 0 ) //
disconnect( s, SIGNAL(signal1()), 0, 0 ) //
QObject::connect(sender, signal, receiver, method)
receiver为this时可省略,只传三个参数
int QObject::receivers(signal)
返回signal信号连接槽的数量
class Object : public QObject
{
public:
int receivers(const char* signal) const
{ return QObject::receivers(signal); }
};
Object object;
QCOMPARE(object.receivers(SIGNAL(destroyed())), 0);
object.connect(&object, SIGNAL(destroyed()), SLOT(deleteLater()));
QCOMPARE(object.receivers(SIGNAL(destroyed())), 1);
object.connect(&object, SIGNAL(destroyed()), SLOT(deleteLater()));
QCOMPARE(object.receivers(SIGNAL(destroyed())), 2);
object.disconnect(SIGNAL(destroyed()), &object, SLOT(deleteLater()));
QCOMPARE(object.receivers(SIGNAL(destroyed())), 0);
QMetaObject::connectSlotsByName
void on_<object name>_<signal name>(<signal parameters>);
每个槽函数都会寻找对应信号,objectName设置为“myobject”
mysig() --> on_myobject_mysig()
mysig(int a) --> on_myobject_mysig(int a)
mysig(int a, int b) --> on_myobject_mysig(int a, int b)
需要注意的是,当注释第一个信号mysig(), on_myobject_mysig()找不到信号mysig(),但有同名的另外两个信号mysig(int a)和mysig(int a, int b),此时会建立以下连接
mysig(int a) --> on_myobject_mysig() // 猜测与mysig(int a)最接近
mysig(int a) --> on_myobject_mysig(int a)
mysig(int a, int b) --> on_myobject_mysig(int a, int b)
// myclass.h
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QObject>
class MyClass : public QObject
{
Q_OBJECT
public:
explicit MyClass(QObject *parent = nullptr);
signals:
// void mysig(); // 此处是关键,注释后有意外发现
void mysig(int a);
void mysig(int a, int b);
public slots:
void on_myobject_mysig();
void on_myobject_mysig(int a);
void on_myobject_mysig(int a, int b);
};
#endif // MYCLASS_H
// myclass.cpp
#include "myclass.h"
#include <QDebug>
MyClass::MyClass(QObject *parent) : QObject(parent)
{
setObjectName("myobject");
QMetaObject::connectSlotsByName(this);
}
void MyClass::on_myobject_mysig()
{
qDebug() << "MyClass::on_myobject_mysig()";
}
void MyClass::on_myobject_mysig(int a)
{
qDebug() << "MyClass::on_myobject_mysig(int a)";
}
void MyClass::on_myobject_mysig(int a, int b)
{
qDebug() << "MyClass::on_myobject_mysig(int a, int b)";
}
// main.cpp
#include <QCoreApplication>
#include "myclass.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyClass m;
emit m.mysig(5);
return a.exec();
}
查找子类对象,有以下两个
qFindChild
qFindChildren (支持正则表达式)
QObject::findChild(name, options)
QObject::findChildren(name, options)
特殊情况
qFindChild<QObject*>(object); // 返回object对象的第一个子类
qFindChild<QObject*>(object, QString()); // 返回object对象的第一个子类
qFindChild<QObject*>(object, ""); // 返回objectname为 "" 的子类,或者未设置objectname的对象
l = qFindChildren<QObject*>(&o); // 返回object对象的所有子类
l = qFindChildren<QObject*>(&o, ""); // 返回子类数组,objectname为 "" 的子类,或者未设置 objectname的对象
object.findChild<QObject*>("o1", Qt::FindDirectChildrenOnly); // 返回object对象objectname为"o1",并且为object的直接子类(第1级子类)
QObject o; // objectName: "o"
QObject o1(&o); // objectName: "o1"
QObject o2(&o); // objectName: "o2"
QObject o11(&o1); // objectName: "o11"
QObject o12(&o1); // objectName: "o12"
QObject o111(&o11); // objectName: "o111"
QObject unnamed(&o);// 未设置objectName,默认为""
QTimer t1(&o); // objectName: "t1"
QTimer t121(&o12); // objectName: "t121"
QTimer emptyname(&o); // objectName: ""
Q_SET_OBJECT_NAME(o);
Q_SET_OBJECT_NAME(o1);
Q_SET_OBJECT_NAME(o2);
Q_SET_OBJECT_NAME(o11);
Q_SET_OBJECT_NAME(o12);
Q_SET_OBJECT_NAME(o111);
Q_SET_OBJECT_NAME(t1);
Q_SET_OBJECT_NAME(t121);
emptyname.setObjectName("");
QList<QObject*> l;
QList<QTimer*> tl;
l = qFindChildren<QObject*>(&o, QRegExp("o.*")); // 或者 QRegularExpression
QCOMPARE(l.size(), 5);
l = qFindChildren<QObject*>(&o, QRegExp("t.*"));
QCOMPARE(l.size(), 2);
tl = qFindChildren<QTimer*>(&o, QRegExp(".*"));
QCOMPARE(tl.size(), 3);
tl = qFindChildren<QTimer*>(&o, QRegExp("o.*"));
QCOMPARE(tl.size(), 0);
l = o.findChildren<QObject*>(QRegularExpression("t.*"));
QCOMPARE(l.size(), 2);
QObject *op = 0;
op = qFindChild<QObject*>(&o); // 默认参数为QString(), 返回o对象的第一个子类
QCOMPARE(op, &o1);
op = qFindChild<QObject*>(&o, ""); // 返回objectname为""的第一个子类
QCOMPARE(op, &unnamed);
op = qFindChild<QObject*>(&o, "unnamed"); // 未找到返回nullptr
QCOMPARE(op, static_cast<QObject *>(0));
监测QObject信号槽连接,重载以下两个函数
class QObject {
public:
virtual void connectNotify(const QMetaMethod &signal);
virtual void disconnectNotify(const QMetaMethod &signal);
};