Qt本身并不是一种编程语言,它实质上是一个跨平台的C++开发类库,是用标准C++编写的类库,Qt对标准C++进行了扩展,引入了一些新的概念和功能,例如信号与槽、对象属性等。
本文将对信号与槽进行简单的介绍,首先,在使用信号与槽机制的类里,必须添加一个Q_OBJECT宏(具体原因会在以后详细介绍),用qmake创建项目会自动添加。
什么是信号和槽?
信号和槽是对象之间进行通信的机制,举一个简单的例子
现在有两个对象 一个是小明(信号的发送方),一个是小明的妈妈(信号的接收方),当小明饿了的时候就会向妈妈发出妈妈我饿了的信号,当妈妈接收到了这个信号后,就会开始做饭(槽:就是对信号进行响应的函数),至于今天具体做什么饭,取决于槽函数的内部是如何实现的。
如何将信号和槽关联起来呢?
通过Qobject:connect()函数可以实现信号和槽的关联
Qt的帮助文档中列举了几种不同参数的connect函数(完整版见帮助文档)
其中 sender是发射信号的对象的名称,signal是信号的名称,receiver是接收信号的对象的名称,method是槽函数的名称
信号与槽最基本且常用的格式为:
connect(sender,&signal,receiver,&method);
许多Qt中的类在创建后就自带信号和槽,比如一个Qpushbutton中就有自带的信号clicked
通常一个信号并不需要具体的实现,只需要在类中定义,但是槽函数必须实现。
我们也可以根据自己的需要自定义信号槽函数
例如:在这个Teacher类中我们就声明了自己的信号hungry()
而在这个Widget中,我们声明了属于自己的槽函数,并且在cpp文件中进行了定义
下面我们用文章中小明饿了妈妈做饭的例子实现一个最简单的信号和槽的链接
在一个新建的Qwidget文件中添加分别创建两个类,一个是Xiaoming,一个是Mother
#ifndef XIAOMING_H
#define XIAOMING_H
#include <QObject>
class Xiaoming : public QObject
{
Q_OBJECT
public:
explicit Xiaoming(QObject *parent = nullptr);
signals:
void hungry();
};
#endif // XIAOMING_H
#include "xiaoming.h"
Xiaoming::Xiaoming(QObject *parent) : QObject(parent)
{
}
#ifndef MOTHER_H
#define MOTHER_H
#include <QObject>
class Mother : public QObject
{
Q_OBJECT
public:
explicit Mother(QObject *parent = nullptr);
signals:
public slots:
void Cooking();//这是一个需要在cpp文件中实现的槽函数
};
#endif // MOTHER_H
#include "mother.h"
#include<QDebug>
Mother::Mother(QObject *parent) : QObject(parent)
{
}
void Mother::Cooking()
{
qDebug()<<"I am cooking";
}
接着,我们在Qwidget.cpp文件中创建小明和妈妈对象并将他们链接
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
Xiaoming *p = new Xiaoming;
Mother *q = new Mother;
connect(p,&Xiaoming::hungry,q,&Mother::Cooking);
p->hungry();
}
Widget::~Widget()
{
delete ui;
}
点击编译运行,就可以看到实现的结果