Qt 信号与槽
Qt 信号与槽机制
基本概念
-
信号与槽机制:Qt 编程的基础与创新,使得处理界面组件交互操作更加直观和简单
-
信号(Signal):在特定情况下被发射的事件,如按钮点击的 clicked() 信号、组合框项变化的 CurrentIndexChanged() 信号
-
槽(Slot):对信号响应的函数,像普通的 C++ 函数,可以在类的任意部分定义
信号和槽的关联
-
关联函数:QObject::connect() 用于将信号和槽关联起来
-
QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
-
connect()是QObject类的一个静态函数而 QObject是所有Qt类的基类在实际调用时可以忽略前面的限定符,所以可以直接写为
- connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
-
-
发送者与接收者:sender 是发射信号的对象,receiver 是接收信号的对象
-
宏:SIGNAL 和 SLOT 是 Qt 的宏,用于指明信号和槽,并将它们的参数转换为字符串
-
示例
-
按钮点击发射 clicked() 信号,窗体的 close() 槽函数将被执行
- QObject::connect(pushButton, SIGNAL(clicked()), MainWindow, SLOT(close()));
-
一个信号可以连接多个槽
- connect(pushButton, SIGNAL(clicked()), this, SLOT(hide());
connect(pushButton, SIGNAL(clicked()), this, SLOT(close());
- connect(pushButton, SIGNAL(clicked()), this, SLOT(hide());
-
多个信号可以连接同一个槽
- connect(pushButton,SIGNAL(clicked()),this,SLOT(close()));
connect(pushButton_2,SIGNAL(clicked()),this,SLOT(close()));
connect(pushButton_3,SIGNAL(clicked()),this,SLOT(close()));
- connect(pushButton,SIGNAL(clicked()),this,SLOT(close()));
-
一个信号可以连接另外一个信号
- connect(pushButton, SIGNAL(objectNameChanged(QString)),this, SIGNAL(windowTitelChanged(QString)));
-
规则
-
参数一致性:信号与槽的参数个数和类型需一致
-
Q_OBJECT 宏:在使用信号与槽的类中,必须在类的定义中加入 Q_OBJECT 宏
-
执行顺序:当信号发射时,关联的槽函数按建立连接的顺序依次执行,执行完槽函数后,才会执行发射信号处后面的代码
断开连接
-
基本方法:disconnect() 用于断开信号与槽的连接
-
bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
-
可以断开所有连接、特定信号的连接或与指定接收者的连接
如何在项目里创建信号
新建项目
- 取消勾选 UI 文件
信号声明
-
mianwindow.h 文件:在该文件中声明信号
-
无需定义:信号只需要声明,无需定义
具体说明
-
第17-18行:声明信号 void pushButtonTextChanged();,无需 public 等关键字修饰
如何在项目中创建槽
声明槽
-
在 mainwindow.h 文件中直接声明槽函数
-
在 mainwindow.cpp 文件中实现槽函数的定义
-
声明槽时必须同时提供其定义(即函数体的实现),否则编译器会报错
槽的特点
-
多种形式:槽可以是类的成员函数、普通全局函数、静态函数
-
参数和返回值:槽函数的参数和返回值必须与对应的信号一致
添加槽函数后的代码
-
mainwindow.h
-
mainwindow.cpp
信号与槽的匹配
- 由于信号 void pushButtonTextChanged() 无参数且无返回值,故对应的槽函数也必须是 void 类型且无参数
QPushButton 的重载构造函数
- QPushButton 类提供了多种构造函数形式,如带文本或图标的构造函数,可以根据需要选择使用
如何在项目中连接信号与槽
连接信号与槽的代码
-
连接按钮点击信号与槽函数
- connect(pushButton, SIGNAL(clicked()), this, SLOT(pushButtonClicked()));
-
连接自定义信号与槽函数
- connect(this, SIGNAL(pushButtonTextChanged()), this, SLOT(changeButtonText()));
发送信号的对象和接收信号的对象
-
pushButtonClicked() 是在本类中定义的槽函数,所以用 this 来接收
-
pushButtonTextChanged() 是在本类中定义的信号,所以发送者写成 this
-
changeButtonText() 也是本类的槽函数,所以接收槽的对象也是 this
mainwindow.cpp 实现连接信号槽
信号与槽的匹配
-
信号 clicked() 由 pushButton 触发
-
槽函数 pushButtonClicked() 处理 clicked() 信号,并发送 pushButtonTextChanged() 信号
-
信号 pushButtonTextChanged() 触发槽函数 changeButtonText(),该函数改变按钮文本
实现了当按钮被点击时,按钮的文本发生变化的功能
学会使用 Qt 类的信号与槽
Qt 内置信号与槽
-
Qt 提供了大量的内置信号与槽,这些信号与槽已经预定义好,基本满足开发需求
-
如果内置信号与槽不能满足特定需求,可以按照自定义信号与槽的方法来定义自己的信号和槽
查找信号与槽
-
在代码中,可以通过 connect 函数来连接信号与槽
-
connect(pushButton, SIGNAL(clicked()), this, SLOT(pushButtonClicked()));
查看信号与槽的定义
-
在 Qt Creator 中,可以按住 Ctrl 键并点击信号或槽的名称,进入其定义处
-
在 Qt Creator 中,可以按住 Ctrl 键并点击信号或槽的名称,进入其定义处
使用 Qt 帮助文档
-
在实际开发中,经常需要使用 Qt 帮助文档来查看 Qt 定义的信号与槽
-
帮助文档提供了详细的信号与槽信息,包括如何查看和使用这些信号与槽