QT Slot/Signal

QT的Slot/Singal-槽/信号

1、Usage/使用方法

所有从 QObject 或其子类 ( 例如 Qwidget) 派生的类都能够包含 信号/signal槽/slot。当对象改变其状态时,信号就由该对象发射 emit 出去,这就是 对象/object所要做的全部事情,它不知道另一端是谁在接收这个信号。这就是真正的信息封装,它确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。

你可以将很多 信号/signal单个 槽进行 连接/connect,也可以将单个的信号多个槽进行连接,甚至于将一个信号与另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。

总结slot函数signal函数参数 需要一一对应。

2、Principle/Truth/Implementation/实现机制

①原理

Using the Meta-Object Compiler (moc)
Why Doesn't Qt Use Templates for Signals and Slots?
How does Qt implement signals and slots?

②QT内部的实现代码(qobjectdefs.h)

Q_CORE_EXPORT const char *qFlagLocation(const char *method);

#define QTOSTRING_HELPER(s) #s
#define QTOSTRING(s) QTOSTRING_HELPER(s)
#ifndef QT_NO_DEBUG
# define QLOCATION "\0" __FILE__ ":" QTOSTRING(__LINE__)
# ifndef QT_NO_KEYWORDS
#  define METHOD(a)   qFlagLocation("0"#a QLOCATION)
# endif
# define SLOT(a)     qFlagLocation("1"#a QLOCATION)
# define SIGNAL(a)   qFlagLocation("2"#a QLOCATION)
#else
# ifndef QT_NO_KEYWORDS
#  define METHOD(a)   "0"#a
# endif
# define SLOT(a)     "1"#a
# define SIGNAL(a)   "2"#a
#endif


问题:QT的信号和槽可否是函数,函数的时候传递了什么,起到了什么作用?

參考:
1、QT 的信号与槽机制介绍
2、QT Signals and slots

posted @ 2016-10-11 15:11  xiulug  阅读(367)  评论(0编辑  收藏  举报