用户名: 密码: 忘记密码? 注册

信号与槽

作者:  时间: 2010-11-23
一、信号与槽概述
(1)信号:一个特定的标示,当内部发生某些事件或状态改变时能够被发射.
(2)槽  :与普通的C++类的成员函数几乎是一样,唯一区别在于,槽可以和信号连接在一起,当发射这个信号的时候,就会自动调用这个槽.
(3)信号与槽的作用:对象之间通信的高级接口.简而言之,信号就是某件事情的触发,槽就是当事情发生时执行的动作.比如,当用户按下"确定"键时,该键就发出clicked()信号,然后槽就用于处理当按下"确定"键后需要执行的动作.
 
二、信号与槽的连接
(1)Designer实现两者的连接
   <1>切换到"信号和槽编辑模式"(图1)
   <2>左键拖动"show"到"helloQT"上,释放鼠标,会弹出信号和槽对话框.(图2)
   <3>选择连接"clicked()"信号和show()槽.(图3)
   <4>用同样的方法连接"Hide"的"clicked()"信号和"helloQT"的show()槽.最终效果如下所示.(图4)
  
(2)代码实现两者的连接
   QObject::connect(a,SIGNAL(a_signal(int)),b,SLOT(b_slot(int)),Qt::ConnectionType);
   <1>参数1:对象a
   <2>参数2:对象a所发出的信号
   <3>参数3:对象b
   <4>参数4:对象b的槽,即对象b处理(对象a所发出的)信号的函数
   <5>参数5:定义了信号与槽之间的关联.常选择默认值Qt::AutoConnection,也可以不写该参数.
   【attention
   <1>一个信号可以连接多个槽.
   <2>多个信号可以连接一个槽.
   <3>一个信号可以与另外一个信号相连接.
   <4>a_signal和b_slot中只能有参数类型,而非具体的值,且类型为Qt已知的类型.
   <5>要将信号成功连接到槽或另外一个信号,它们的参数必须具有相同的类型和个数.若信号参数比槽的参数多,则多数的参数将被忽略.
    【attention
   在Qt中,除了使用系统提供的信号和槽外,还可以使用程序员自己定义的信号与槽.它的实现过程如下:
   <1>类的开始声明处加入宏Q_OBJECT.
   <2>在函数声明前加入signals和slots关键字.
   <3>信号只需声明,无需实现.使用时只需 emit mysignal(参数列表)
   <4>槽函数和普通C++成员函数一样实现.
   <5>自定义槽函数的另一种书写形式:
      on_<sender_objectName>_<signal>(参数)
   如:void on_pushButton_clicked()
      对象名:pushButton   信号:clicked()
   注意,这样书写的槽函数,系统会自动进行相对应信号与槽的连接,不需要connect.
     【attention】QTimer定时器
   QTimer *timer = new QTimer(this);
   timer->start(1000);  /*定时器启动后,每隔1s发送一timeout()信号*/
   timer->stop();         /*停止定时器*/