QT----自定义信号和槽

第二天

2.1自定义信号和槽

新建一个Qtclass

自定义信号:返回值是void ,只需要声明,不需要实现,可以有参数,可以重载

自定义槽:返回值void ,需要声明,也需要实现,可以有参数,可以发生重载

首先新建学生和老师的类。在老师的头文件中添加自定义信号,将代码写在signals:下来实现自定义信号(只需要声明不需要实现)

cpp 复制代码
class Teacher  : public QObject
{
    Q_OBJECT
public:
    Teacher(QObject *parent);
    ~Teacher();
//自定义信号写到signals下
//返回值是void ,只需要声明,不需要实现
//可以有参数,可以重载
signals:
    void hungry();
};

在学生类里定义槽返回值void ,需要声明,也需要实现可以有参数,可以发生重载。

cpp 复制代码
class Student  : public QObject
{
public:
 Student(QObject *parent);
 ~Student();
public slots:
 //返回值void ,需要声明,也需要实现
 //可以有参数,可以发生重载
 void treat();
};

void Student::treat()
{
 qDebug("请老师吃饭");
}

现在weidet头文件里新建老师和学生的指针,在到cpp里把他们实例化绑定到父类加入对象树,并且使用connect进行连接。光有连接还不行(=必须要先连接在调用=),需要调用的时机,使用emit来定义触发的时机。写完后就能在输出里看到打印了这段文字。

cpp 复制代码
#include <QtWidgets/QWidget>
#include "ui_widget.h"
#include "Teacher.h"
#include "Student.h"

class widget : public QWidget
{
    Q_OBJECT
public:
    widget(QWidget *parent = nullptr);
    ~widget();
private:
    Ui::widgetClass ui;

    //先申明两个指针
    Teacher* te;
    Student* st;
  //声明调用函数


    void classisover();
};

#include "widget.h"

widget::widget(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

    //创建一个老师对象,右边的this是设置父类加入对象树
    this->te = new Teacher(this);

    //创建一个学生对象
    this->st = new Student(this);
    //搭建连接,要先连接在传递信号
    connect(te,&Teacher::hungry,st,&Student::treat);

    classisover();
}

widget::~widget()
{
    
}

void widget::classisover()
{
    //下课函数,调用后出发老师饿了的信号
    emit te->hungry();
}

2.2 重载信号和槽

在老师头文件重载hungry函数为void hungry(QString foodname)信号只需要声明不需要实现。

在学生头文件重载 ​treat​ 函数,并实现食物名。后边加toUtf8().data()是因为不加的话字符串输出有引号

cpp 复制代码
void Student::treat(QString foodname)
{
 //QString -> char *先砖成QByteArray(.toutf8())再转char * (.data())
 qDebug()<<"请老师吃饭"<<foodname.toUtf8().data();
}

此时需要修改调用函数加入食物名称,connect找不到该连接的函数,应为没有指定哪个重载。需要用下边的方式来使用函数指针指向你想连接的函数重载

cpp 复制代码
//连接到带参数的信号和槽
//函数指针指向函数地址
void (Teacher:: *teacherSignal)(QString) = &Teacher::hungry;
void (Student:: *studentSlot)(QString) = &Student::treat;

connect(te, teacherSignal, st, studentSlot);
classisover();

void widget::classisover()
{
    //下课函数,调用后出发老师饿了的信号
    emit te->hungry("gongbaojiding");
}

2.3 信号连接信号

1、信号是可以连接信号

2、一个信号可以连接多个槽函数

3、多个信号可以连接同一个槽函数

4、信号和槽函数的参数必须类型------对应

5、信号和槽的参数个数﹑是不是要一致?信号的参数个数可以多余槽函数的参数个数(按钮的点击是bool一个参数,所以只能用空的函数重载去连接信号)

还可以使用按钮来触发这个信号,点击就会触发

cpp 复制代码
//点击一个按钮下课
QPushButton* btn = new QPushButton("下课",this);
this->resize(600,400);

//点击按钮,下课
connect(btn,&QPushButton::clicked,this,&widget::classisover);

使用信号连接信号,无参信号和槽连接,相当于点击信号触发老师信号,老师信号又触发学生请客的信号,三者关联起来了

cpp 复制代码
//无参信号和槽连接
//连接到带参数的信号和槽
//函数指针指向函数地址
void (Teacher:: * teacherSignal)(void) = &Teacher::hungry;
void (Student:: * studentSlot)(void) = &Student::treat;
connect(te, teacherSignal, st, studentSlot);

//信号连接信号
connect(btn, &QPushButton::clicked, te, teacherSignal);

2.4 lambda表达式

5.4版本之前要使用Lambda,需要在.pro文件处添加这么一行代码CONFIG += C++11\

相关推荐
大风起兮云飞扬丶1 小时前
Java——枚举
java·开发语言
小灰灰搞电子1 小时前
Rust+Slint 实现高级动态消息提示框源码分享
开发语言·rust
Dev _2 小时前
Python解释器安装在系统级目录导致命令行用户‌没有权限‌向该目录写入文件
开发语言·python
qq_406981032 小时前
大白话rust系列08 当变量遮蔽遇上引用,探究变量遮蔽的本质
开发语言·后端·rust
喵了几个咪2 小时前
GoWind ShortPlay 拆解:不用模型的推荐闭环——埋点回流、三路召回与已看去重
开发语言·后端·微服务·golang·gowind
谙弆悕博士2 小时前
用 C 写了个 Windows 聊天室,踩了几个多线程和控制台的坑
c语言·开发语言·c++·windows·网络编程·聊天室
Canmag 兴隆磁性2 小时前
回复磁导率 μ_R:永磁体在动态磁路中的关键参数
开发语言·学习·r语言·永磁材料·充磁·磁导率
CRMEB系统商城3 小时前
鲜花零售的预售与积分营销
开发语言·人工智能·科技·小程序·零售
Wang's Blog3 小时前
Java 项目实战: 交友项目 - 喜欢与取消喜欢
java·开发语言·交友
quantdash_cc3 小时前
如何检查滚动收益率计算中的窗口长度不足?——从数学定义到 Pandas 实现
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash