简介
- 信号与槽是Qt编程的基础,也是Qt的一大创新。因为有了信号与槽的编程机制,在Qt中处理界面各个组件的交互操作时变得更加直观和简单。
- 信号(signal)就是在特定情况下被发射的事件,槽(slot)就是对信号响应的函数。槽函数与一般函数的不同是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。
- 本文章主要介绍下标准信号与槽的使用,自定义信号与槽的使用,以及信号的重载。
规则
- 一个信号可以连接多个槽
- 多个信号可以连接同一个槽
- 一个信号可以连接另外一个信号
- 严格情况下,信号与槽的参数个数和类型需要一致,至少信号的参数不能少于槽函数的参数
- 在使用信号与槽的类型,必须在类的定义中加入宏 Q_OBJECT
- 当一个信号被发射时,与其关联的槽函数通常被立即执行。只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码。
标准信号槽
- 创建一个QWidget界面,然后在界面上放置一个Push Button。
- 直接在构造函数中,连接信号与槽函数。即点击按钮时,关闭当前窗口。
标准信号与自定义槽函数
- 比如我们点击鼠标时,想弹出一个对话框,这个时候就可以自己实现一个槽函数。
- 在界面上放置一个按钮 pushButton_dlg
- 在widget.h中定义一个槽函数
-
private slots: void btnResponseSlot();
- 在widget.cpp中实现槽函数。功能是弹出一个对话框。
-
void Widget::btnResponseSlot() { //注意要包含下<QMessageBox>头文件 QMessageBox::information(this, "info", "btn clicked"); }
- 然后在构造函数中,连接信号与我们自定义的槽函数
-
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); //连接信号槽 connect(ui->pushButton_dlg, &QPushButton::clicked, this, &Widget::btnResponseSlot); }
- 运行程序,点击按钮时,就会弹出一个对话框
自定义信号与自定义槽函数
- 使用自定义信号与自定义槽函数,可以实现两个窗口之间的通信。
- 先创建两个QWidget窗口,主窗口和子窗口。
- 计划实现这样一个效果,点击子窗口上的按钮,可以将子窗口上编辑框中的数据传递到主窗口上进行显示
- 在主窗口上放置一个Plain Text Edit控件
- 在子窗口上放置一个Line Edit和Push button
- 右击按钮,选择转到槽
- 选择第一个点击事件
- 在subwidget.cpp中就会自动生成一个槽函数,点击鼠标后,就会自动调用该函数。这和我们上个案例中实现自定义槽函数是一样的。只不过这里是系统已经帮我们把鼠标点击信号和该槽函数进行了绑定,我们不需要再手动绑定了。
- 然后在子窗口头文件 subwidget.h中定义一个信号
-
signals: void sendData(QString str);
- 信号是不需要实现的。直接在鼠标点击信号对应的槽函数中,发送我们自定义的信号。
-
void SubWidget::on_pushButton_clicked() { //获取编辑框内容 QString str = ui->lineEdit->text(); //发送信号 emit sendData(str); }
- 在主窗口头文件 widget.h中包含子窗口头文件,并定义一个子窗口对象和自定义槽函数
- 然后在widget.cpp中,先显示子窗口,再连接信号槽,在槽函数中将子窗口发送来的数据进行展示
- 运行看下效果
- 这样我们就可以实现主窗口和子窗口之间的数据交互。
信号重载
- 还是使用上个案例。定义一个无参的信号
- 在subwidget.cpp中也发送该信号
- 在widget.h中也定义一个无参的槽函数
- widget.cpp中实现无参槽函数
-
void Widget::recvSubDataNoParam() { //显示 ui->plainTextEdit->appendPlainText("hello word csdn"); }
- 这个时候连接信号与槽的时候就会出问题,因为信号进行了重载,编译器不知道我们连接的是哪一个信号。编译就会出错,因此需要定义指针函数进行显式声明。
- 效果