QT信号与槽机制解析

信号(Signal)与槽(Slot)是Qt编程的基础。有了信号与槽的编程机制,在Qt中处理界面各个组件的交互操作时变得更加直观和简单。

GUI程序设计的主要内容就是对界面上各组件的信号的响应,只需要知道什么情况下发射哪些信号,合理地去响应和处理这些信号就可以了。


信号(Signal)就是在特定情况下被发射的事件,例如:一个PushButton最常见的信号就是鼠标单击时发射的clicked()信号。

槽(Slot)就是对信号响应的函数。说白了槽就是一个函数,与一般的C++函数是一样的,可以定义在类的任何部分(public、private或protected),可以具有任何参数,也可以被直接调用。

不同:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。

信号与槽关联是用QObject::connect()函数实现的,其基本格式是:

QObject::connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));

connect()是QObject类的一个静态函数,而QObject是所有Qt类的基类,在实际调用时可以忽略前面的限定符,所以可以直接写为:

connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));

具体说明如下:

1、sender是发射信号的对象的名称。

2、signal()是信号名称。信号可以看做是特殊的函数,需要带括号,有参数时还需要指明参数。

3、receiver是接收信号的对象名称。

4、slot()是槽函数的名称,需要带括号,有参数时还需要指明参数。

5、SIGNAL和SLOT是Qt的宏,用于指明信号和槽,并将它们的参数转换为相应的字符串。

 

例:

QObject::connect(btnClose,SIGNAL(clicked()),Widget,SLOT(close()));

其作用就是将btnClose按钮的clicked()信号与窗体(Widget)的槽函数close()相关联,这样,当单击btnClose按钮(就是界面上的“Close”按钮)时,就会执行Widget的close()槽函数。

信号与槽的使用规则:

1、一个信号可以连接多个槽

例如:

connect(spinNum,SIGNAL(valueChanged(int)),this,SLOT(addFun(int));
connect(spinNum,SIGNAL(valueChanged(int)),this,SLOT(updateStatus(int));

具体说明如下:

.这是当一个对象spinNum的数值发生变化时,所在窗体有两个槽进行响应,一个addFun()用于计算,一个updateStatus()用于更新状态。
.当一个信号与多个槽函数关联时,槽函数按照建立连接时的顺序依次执行。
.当信号和槽函数带有参数时,在connect()函数里,要写明参数的类型,但可以不写参数名称。

 

2、多个信号可以连接同一个槽,例如让三个选择颜色的RadioButton的clicked()信号关联到相同的一个自定义槽函数setTextFontColor()。

connect(ui->rBtnBlue,SIGNAL(clicked()),this,SLOT(setTextFontColor()));
connect(ui->rBtnRed,SIGNAL(clicked()),this,SLOT(setTextFontColor()));
connect(ui->rBtnBlack,SIGNAL(clicked()),this,SLOT(setTextFontColor()));

这样,当任何一个RadioButton被单击时,都会执行setTextFontColor()函数。

 

3、一个信号可以连接另外一个信号,例如:

connect(spinNum,SIGNAL(valueChanged(int)),this,SIGNAL(refreshInfo(int));

这样,当一个信号(valueChanged)发射时,也会发射另外一个信号(refreshInfo),实现某些特殊的功能。

 

信号与槽使用注意事项:

1、严格的情况下,信号与槽的参数个数和类型需要一致,至少信号的参数不能少于槽的参数。如果不匹配,会出现编译错误或运行错误。

2、在使用信号与槽的类中,必须在类的定义中加入宏Q_OBJECT。

3、当一个信号被发射时,与其关联的槽函数通常被立即执行,就像正常调用一个函数一样。只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码。
4、信号与槽机制是QtGUI编程的基础,使用信号与槽机制可以比较容易地将信号与响应代码关联起来。

 

发布了19 篇原创文章 · 获赞 47 · 访问量 2636

猜你喜欢

转载自blog.csdn.net/papership/article/details/104370832
今日推荐