QT信号连接信号

有时候代码可能复杂,我们需要一个信号连接另一个信号,比如例子中的下课不是直接运行时触发的,而是点击下课按钮

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QPushbutton.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //创建一个老师对象
    this->tc = new Teacher(this);
    //创建一个学生对象
    this->st = new Student(this);
    void(Teacher::*teachersignal2)(void) =  &Teacher::Hungry;
    void(Student::*studentslot2)(void) =  &Student::Treat;
    connect(tc,teachersignal, st, studentslot);
    QPushButton *btn = new QPushButton("下课",this);
    this->resize(600,400);

    connect(tc,teachersignal2, st, studentslot2);
    connect(btn,&QPushButton::clicked,tc,teachersignal2);
}

MainWindow::~MainWindow()
{
    delete ui;
}

扩展内容

断开信号 使用disconnect(tc,teachersignal2, st, studentslot2);
一个信号可以连接多个槽函数
多个信号可以连接一个槽函数

在teacher类加入一个crying信号

#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>


class Teacher : public QObject
{
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = nullptr);

signals:

  void Hungry();
  void Hungry(QString foodName);
  void Crying();  //老师感动哭了

};
#endif // TEACHER_H
#
  void(Teacher::*teachersignal)(QString) =  &Teacher::Hungry;
    void(Student::*studentslot)(QString) =  &Student::Treat;
    void(Teacher::*teachersignal2)(void) =  &Teacher::Hungry;
    void(Student::*studentslot2)(void) =  &Student::Treat;
    void(Teacher::*teachersignal3)(void) =  &Teacher::Crying;
    connect(tc,teachersignal, st, studentslot);
    //classIsOver();
    QPushButton *btn = new QPushButton("下课",this);
    this->resize(600,400);
    //connect(btn,&QPushButton::clicked,this,&MainWindow::classIsOver);

    connect(tc,teachersignal2, st, studentslot2);
    connect(tc,teachersignal3, st, studentslot2);
    connect(btn,&QPushButton::clicked,tc,teachersignal2);
    connect(btn,&QPushButton::clicked,tc,teachersignal3);


代码中我使用qpushbutton触发了两个信号,同理我也可以使用不同信号触发同一个槽函数

信号和槽函数的参数必须一一对应
信号参数个数可以多余槽的参数个数,但类型要一一对应


Qt4版本以前的信号与槽的连接
连接无参
connect(tc,SIGNAL(Hungry()),st,SLOT(Treat()));
优点,参数直观。缺点,类型不做检测(编译不做检测,运行报错)

Qt5以上支持Qt4的写法,反之不支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这个月太忙没时间看C++

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值