2021.5.29:QT——信号槽机制

学习自:Qt信号与槽机制详解

信号与槽Signal & Slot)是QT编程的基础。

信号(Signal):其实就是C++中的一个个事件,比如鼠标单击,按了键盘键等。C++中的事件在QT变成了信号,即特定情况下被发射的事件。

GUI程序设计的主要内容就是对界面上各组件的信号的响应,只需要知道何时发送哪些信号,从而合理地对这些信号进行响应和处理。

槽(Slot)信号响应函数。槽函数与一般的C++函数类似,可以定义在类的任何部分(public、private、protected),可以具有任何参数,也可以被直接调用;二者的区别在于,槽函数一般与信号关联,当信号被发射时,关联的槽函数被自动执行

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

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

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

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

其中,

sender信号源对象

signal()是信号函数,需要带括号,有时还需要有参数;

receiver信号接收对象

slot()是信号处理槽函数,需要带括号,有时需要指明参数。

另外,SIGNALSLOT是QT的,用于指明信号,并将它们的参数转换为相应的字符串。例如,在之前的项目中的ui_widget.h文件中,在setupUi()函数中用如下语句:

connect( btnClose , SIGNAL(clicked()) , MainWindow , SLOT(close()) )

现在,我们就可以对这句话进行解释了:

信号源PushButton btnClose

发送的信号clicked(),即点击这个按钮;

响应对象主窗口MainWindow

响应方式close()

意思是单击按钮后,MainWindow接收这个单击信号,响应方式是关闭窗体。

 

信号与槽的应用,还有以下一些规则:

  • 一个信号可以有多个响应槽,例如:
    connect(spinNum,SIGNAL(valueChanged(int)),this,SLOT(addFunc(int)));
    connect(spinNum,SIGNAL(valueChanged(int)),this,SLOT(updateStatus(int)));

    意思是,当spinNum组件的数值发生变化时,所在窗体(即this)有两个槽进行响应,一个addFunc()用于计算,一个updateStatus()用于更新状态;

    注意到,当signal()slot()函数有参数时,可以不写参数名称,但必须写参数类型(如上文的int

  • 多个信号可以连接到同一个槽,正如我们之前的例子中,让3个选择颜色的RadioButtonclicked()信号关联到相同的一个自定义槽函数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()函数。

  • 一个信号可以连接另一个信号,例如:
    connect(spinNum,SIGNAL(valueChanged(int)),this,SIGNAL(refreshInfo(int)));

    这种情况下,一个信号发送时,另一个信号也会被发送,实现某些特殊的功能。

  • 严格情况下,信号与槽的参数个数与类型需要一致,至少信号的参数不能少于槽的参数。否则可能会出现编译、运行异常;
  • 在使用信号与槽中,必须在类的定义中(.h文件)加入宏Q_OBJECT
  • 当一个信号发射后,关联的槽函数会立即执行。当关联的所有槽函数执行完毕后,才会执行发射信号处后边的代码

总结

  • 信号——各个事件,如鼠标点击、键盘……
  • 槽——对这些事件的响应函数
  • 信号与槽通过connect()函数连接,基本格式是:
    connect(sender , SIGNAL(signal) , receiver , SLOT(slot()))

     

  • 信号与槽的对应关系可以是:
    • 一对一(最常见,一个事件一个响应);
    • 一对多(一个事件触发多个响应,比如点击按钮,同时实现计算与刷新界面的功能),这时需要有多个connect语句,分别将同一个信号和不同的槽关联;
    • 多对一(多个控件的信号同一个响应函数加以处理,这里响应函数中通常要用if语句来判断传入的是哪个控件,例如之前的多个选择颜色的RadioButton对应同一个字体颜色函数setTextFontColor()
    • 一个信号与另一个信号关联(发送一个信号时,另一个信号也会发送)
posted @ 2021-05-29 16:36  ShineLe  阅读(119)  评论(0)    收藏  举报