目录
信号和槽的概述
Qt中的信号与Linux中的信号,虽然不是一样的概念,但是却有相似之处。
在Qt中,谈到信号,涉及到三个要素:
- 信号源:由哪一个控件发出的信号。
- 信号的类型:用户进行不同的操作可能触发不同的信号。
- 信号的处理方式:槽函数。
在Qt中,用户和控件的每一次交互过程称为一个事件。就比如,“用户点击按钮”是一个事件,“用户关闭窗口”也是一个事件。每个事件都会发出一个信号,就比如,“按钮被点击”的信号,“窗口被关闭”的信号。这种GUI程序,目的就是为了让用户进行操作,就是为了和用户进行交互,这个过程中就需要关注用户当前的具体操作。
Qt中的所有控件都具有接受信号的能力,一个控件还可以接受多个不同的信号。对于接收到的每个信号,控件都会做出相应的响应动作,就比如,按钮所在的窗口接收到“按钮被点击”的信号之后,会做出“关闭窗口”的操作。在Qt中,对信号做出的响应动作就称之为槽。
信号和槽是Qt特有的消息传输机制,它能将相互独立的控件关联起来,就比如,“窗口”和“按钮”俩个独立的控件,点击按钮并不会对窗口造成影响,但是通过信号与槽机制,可以将按钮与窗口连接起来,实现关闭窗口的操作。
信号
信号是由于用户对窗口或者控件进行了某些操作,导致窗口或控件产生了某个特定事件,这时Qt对应的窗口类会发出某个信号,以此对用户的操作做出反应。因此,信号的本质就是事件。
- 按钮单机、双击
- 窗口刷新
- 鼠标移动、鼠标按下、鼠标释放
- 键盘输入
Qt中的信号通过什么形式呈现给使用者?
- 对某个窗口进行操作,窗口会捕捉这些被触发的事件。
- 触发事件可以得到Qt框架发出的信号。
- 信号的呈现形式就是函数,就是说某个事件产生了,Qt框架会调用某个对应的信号函数。
【注意】Qt中信号的发出者是某个实例化的类对象。
槽
槽(SLot)就是对信号响应的函数。槽就是一个函数,与一般的C++函数一样,可以定义在类的任何位置(public、protected或private),可以具有任何参数,可以被重载,也可以被直接调用(但是不能由默认参数)。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。
槽函数的本质也是一种回调函数(callback)。
【说明】:
(1)信号和槽机制底层是通过函数间的相互调用实现的。每个信号都可以用函数来表示,称为信号函数;每个槽也可以用函数表示,称为槽函数。
(2)信号函数和槽函数通常位于某个类中,和普通的成员函数相比,其特别之处在于:
- 信号函数用signals关键字修饰,槽函数用public slots、protected slots或者private slots修饰。signals和slots是Qt在C++的基础上扩展的关键字,专门用来指明信号函数和槽函数。
- 信号函数只需要声明,不需要定义(实现),槽函数需要定义(实现)。
【注意】信号函数的定义是Qt在编译之前生成的,这种自动生成代码的机制称为元编程。
信号与槽的使用
连接信号与槽
在Qt中可以使用connect这样的函数,把一个信号和一个槽关联起来,后续只要信号触发了,Qt就会自动的执行槽函数。一定需要将信号的处理方式准备好,在进行触发信号。
在Qt中,一定先关联信号和槽,然后再触发信号,顺序是不能颠倒的。
connect是QObject提供的金泰的成员函数,该函数专门用来关联指定的信号函数和槽函数。
QObject是Qt内置的父类,Qt中提供的很多类都是直接或者间接继承自QObject。
像QPushButton、QLineEdit、QTextEdit...这些类都有一个父类QWidget,这个QWidget是一个控件,QWidget的父类是QObject.
connect()函数原型
connect (const QObject *sender,
const char * signal ,