Qt的信号和槽(Signals and Slots)机制是一种强大的对象间通信方式,它允许对象在完全解耦的情况下相互通信。以下是关于Qt信号和槽的简明教程:
基本概念
信号(Signal):信号是由Qt对象发出的通知,表明某种事件已经发生。例如,按钮被点击、窗口关闭请求等。
槽(Slot):槽是接收信号并执行相应操作的函数。它可以是任何普通成员函数,不局限于特定的类或接口。
打开头文件 widget.h ,向其中添加槽函数声明
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
//添加这一段代码
public slots: //槽函数声明标志
void FoodIsComing(); //槽函数
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
Qt 的关键字 slots 就是槽函数声明段落的标志,槽函数声明段落可以是 private、protected 或者 public 类型的,这些访问权限和继承权限与普通成员函数是一样的,上面示范的是公有槽函数。除了声明段落标志不一样,槽函数与普通成员函数其他情况都是一样的,也可以作为普通成员 函数来调用,当然也必须有函数定义的实体代码,头文件里仅仅是声明。我们打开 widget.cpp 文件,添加头文件包含 和 槽函数定义代码:
#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//添加关联代码,必须放在 setupUi 函数之后
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(FoodIsComing()));
}
Widget::~Widget()
{
delete ui;
}
//槽函数定义代码,与普通成员函数类似
void Widget::FoodIsComing()
{
QMessageBox::information(this, tr("送餐"), tr("叮咚!外卖已送达"));
}
下面第三步是将 pushButton 的信号 clicked (即“我饿了”)与 主窗口的槽函数 FoodIsComing 关联起来,实现自动拨号叫外卖。Qt 通过 QObject::connect 函数完成信号和槽函数的关联,因为主窗口最顶层的基类是 QObject,所以我们下面代码不需要加 QObject:: 前缀。我们向 widget.cpp 文件构造函数里新增一句关联函数代码,完整的 widget.cpp 代码如下:
//添加关联代码,必须放在 setupUi 函数之后
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(FoodIsComing())); //旧式语法
connect(ui->pushButton, &QPushButton::clicked, &Widget::FoodIsComing); //新式语法