信号与槽是QT提供的一种事件处理机制
一、信号和槽
信号:用户对串口进行某些操作,导致窗口或控件发生某个事件。
严格来说 信号的本质就是事件
例如: 按钮单双击、窗口刷新、鼠标操作、键盘输入等等。
当触发事件之后,QT框架会调用根据事件对应的信号函数,而这个信号函数就是槽函数。
槽:在QT中,槽函数是一种特殊功能的函数,在编译过程也可以当作普通函数使用,之所以称为槽函数是因为其对应着QT框架中产生的信号处理。
1.1、信号与槽的关系
信号与槽其实都是独立的个体,本身并没有关系,但是因为某些特殊的需求则导致二者连接在一起,在QT中,使用QOjbect类中的connect函数进行二者连接。
QMetaObject::Connection QObject::connect(
const QObject *sender, const char *signal,
const QObject *receiver, const char *method,
Qt::ConnectionType type = Qt::AutoConnection)
sender : 发出信号的对象
signal : 信号函数地址
receiver: 信号接收者
method : 信号触发之后的对应的槽函数
1.2、标准信号槽使用
例子:
当按键按下时,关闭当前串口
其中 ui->pushButton 为按键对象 this为当前窗口。
&QPushButton::clicked 为按键按下触发信号,&MainWindow::close 则为按下之后处理的事情。
1.3、自定义信号槽使用
当QT提供的信号槽无法满足我们使用要求的时候,则需要自己去设计自己需求的信号与槽,还是使用connect进行对自定义的信号槽
如果想要自己定义信号槽,那么需要重新编写类让其继承Qt某些标准,自己编写的类想要使用信号槽则需要满足以下条件:
如下所示:
class myMainWindow:public QWidget
{
Q_OBJECT
...........
}
1.3.1 自定义信号
自定义信号则需要满足以下要求:
例如:
class test : public QObject
{
Q_OBJECT
signals:
void testsignals();
//参数的作用在于传输数据。
void testsignals(int a);
}
1.3.2 自定义槽
槽函数就是信号的处理动作,自定义槽函数与自定义函数写法一样的。
例如:
class test : public QObject
{
public:
void testSlots();
static void testFun();
public slots:
void tsetSlot(int id);
}
1.4 信号槽拓展
1、一个信号可以连接多个槽函数,发一个信号多个处理
需要写多个connect连接
槽函数的执行顺序是随机的,与connect的调用无关
信号的接收者可以是一个对象也可以是多个对象
2、一个槽函数可以连接多个信号,多个不同的信号,处理动作是相同的
写多个connect就可以
3、信号可以连接信号
信号接受者可以补不出来接收信号,继续发送新的信号->传递了数据并没有处理
4、信号槽是可以断开的
disconnect
1.5、lambad表达式
lambda表达式就是一个匿名函数,如法如下: