捋一捋,在Qt4、5中,信号与槽的一些细节。
先从Qt4、5中,用于连接信号和槽的connect函数开始讲起。
在Qt4中,connect函数的原型有以下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中,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);
在Qt4和Qt5的connect函数原型中,我们发现Qt5比Qt4多处了2种原型:
QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
const QObject *, PointerToMemberFunction,
Qt::ConnectionType);
QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
Functor);
注意:这两种原型在Qt5中是可以传入信号和槽的“函数指针”的,通俗一点就是可以直接将“函数名”作为参数传进去,正是因为这一点,在写“槽”的时候就需要注意到public、protected和private的问题。
在以前的Qt4中,“信号和槽”是通过SIGNAL()和SLOT()的方式来连接的,现在可以使用“函数名”的方式来连接,就需要考虑到“函数名”是否有效,在将“槽”声明为protected和private的时候,在类外是不能直接通过对象来访问到该函数的,即:在类外使用connect并传入“函数名”时,将会编译不通过,此时需要将protected、private更改为public即可。