Qt的槽函数的public,protected,private以及Qt4、5中的connect函数。

来源:互联网 发布:mac的远程桌面连接 编辑:程序博客网 时间:2024/06/06 02:34

捋一捋,在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即可。

阅读全文
1 0
原创粉丝点击