信号槽是Qt的一大特征,刚开始学Qt,主要是从豆子空间那学习的。
信号槽机制功能类似观察者模式。通过QObject的connect()函数连接起来。Qt5中,connect()函数有5个重载:
QMetaObject::Connection connect(const QObject *, const char *,
const QObject *, const char *,
Qt::ConnectionType);
QMetaObject::Connection connect(const QObject *, const QMetaMethod &,
const QObject *, const QMetaMethod &,
Qt::ConnectionType);
QMetaObject::Connection connect(const QObject *, const char *,
const char *,
Qt::ConnectionType) const;
QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
const QObject *, PointerToMemberFunction,
Qt::ConnectionType)
QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
Functor);
- 发送者和接收者都需要是 QObject 的子类(当然,槽函数是全局函数、Lambda 表达式等无需接收者的时候除外);
- 使用 signals 标记信号函数,信号是一个函数声明,返回 void,不需要实现函数代码;
- 槽函数是普通的成员函数,作为成员函数,会受到 public、private、protected 的影响;
- 使用 emit 在恰当的位置发送信号;
- 使用 QObject::connect() 函数连接信号和槽。
Qt4中则有3个不同的重载:
bool connect(const QObject *, const char *,
const QObject *, const char *,
Qt::ConnectionType);
bool connect(const QObject *, const QMetaMethod &,
const QObject *, const QMetaMethod &,
Qt::ConnectionType);
bool connect(const QObject *, const char *,
const char *,
Qt::ConnectionType) const
关键是, Qt5中信号槽连接语法是在编译期检查,而Qt4是在运行时。
传参情况:信号参数个数不少于槽函数参数个数,且要一一对应(类型,顺序);特殊情况是(信号参数少于槽函数参数)槽函数多的参数有默认值。
自定义信号槽:
关键字:signals slots
槽函数受修示符public、private、protected影响;
信号不用自己编写,moc(meta object compiler元对象编译器)预处理(比C++预处理更早)时自动处理。