就我我的来理解,信号槽机制与Windows下消息机制相似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁。编程
信号和槽机制是 Qt 的核心机制,可让编程人员将互不相关的对象绑定在一块儿,实现对象之间的通讯。安全
信号函数
当对象改变其状态时,信号就由该对象发射 (emit) 出去,并且对象只负责发送信号,它不知道另外一端是谁在接收这个信号。这样就作到了真正的信息封装,能确保对象被看成一个真正的软件组件来使用。指针
槽code
用于接收信号,并且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与本身相链接。并且对象并不了解具体的通讯机制。对象
信号与槽的链接blog
全部从 QObject 或其子类 ( 例如 Qwidget ) 派生的类都可以包含信号和槽。由于信号与槽的链接是经过 QObject 的 connect() 成员函数来实现的。get
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
其中 sender 与 receiver 是指向对象的指针,SIGNAL() 与 SLOT() 是转换信号与槽的宏。回调函数
一个信号能够链接多个槽博客
当信号发射时,会以不肯定的顺序一个接一个的调用各个槽。
多个信号能够链接同一个槽
即不管是哪个信号被发射,都会调用这个槽。
信号直接能够相互链接
发射第一个信号时,也会发射第二个信号。
链接能够被移除
这种状况用得比较少,由于在对象被删除时,Qt会自动移除与这个对象相关的全部链接。语法以下:
disconnect(sender, SIGNAL(signal), receiver, SLOT(slot));
这个demo程序由一个Label和PushButton组成,第一个例子中点击按钮,可让label关闭,这是最简单的信号与槽的链接;第二例子中点击按钮,在label上获取当前系统时间,这个涉及到的知识点有:信号与槽的参数类型不一样时如何链接、自定义槽函数、自定义信号。
首先,新建一个Qt GUI程序,父窗口选为QDialog,类名为getTime,在头文件和CPP文件分别加入以下代码(小生愚钝,还没弄清楚博客园MarkDown代码块怎么高亮,因此只好贴截图了,见谅)
头文件
实现文件
保存、编译、运行以后点击按钮便可看到label消失了。
而后在头文件中加入自定义的槽函数和信号,并在CPP文件中实现槽函数,具体以下:
头文件
实现文件
而后保存,编译运行便可,点击按钮后就能看到label上显示当前时间了。