QT学习 --自定义的信号与槽发生重载的解决

当自定义的信号与槽发生重载时,应该怎样处理呢?

首先,要定义一个函数指针。其次,我们在声明一个成员函数的函数地址时,要把成员函数的作用域也放到指针的前面。

在 student.h 中

#ifndef STUDENT_H
#define STUDENT_H

#include <QObject>

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

signals:

public slots:
    //早期的Qt版本 自定义槽函数必须写到public slots下
    //高级的Qt版本 自定义槽函数可以写到public slots、public下或全局作用域下
    //返回值 void ,需要声明,也需要实现
    //可以有参数,也可以发生重载
    void run();

    void run(QString type);

};

#endif // STUDENT_H

在 teacher.h 中

#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>

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

signals:
    //自定义信号 写到signals下
    //返回值是void,只需要声明,不需要实现
    //可以有参数,可以重载
    void classoff();

    void classoff(QString type);
};

#endif // TEACHER_H

在 student.cpp 中

#include "student.h"
#include <QDebug>
Student::Student(QObject *parent) : QObject(parent)
{

}
void Student ::run()
{
    qDebug()<<"抢饭第一名";
}

void Student ::run(QString type)
{
    qDebug()<<"抢饭第一名"<<type;
}

在 teacher.cpp 中,因为信号只需声明,而不用实现。

#include "teacher.h"

Teacher::Teacher(QObject *parent) : QObject(parent)
{

}

在 mywidget.cpp 中

myWidget::myWidget(QWidget *parent)
    : QWidget(parent)//这个在C++语法中被称为初始化列表
{
    //创建一个老师的对象
    this ->wu =new Teacher(this);
    //创建一个学生的对象
    this ->ming =new Student(this);

    //下课铃响了(相当于是按键的点击事件),老师(信号的发送者)说下课(信号),小明(信号的接收者)往外跑(槽函数)。
    //指针可以指向地址,现在要指向&Teacher::classoff(是一个函数的地址)
    //因此要定义一个函数指针
    //我们在声明一个成员函数的函数地址时,要把成员函数的作用域也放到指针的前面
    void (Teacher:: *teacherSignal)(QString)=&Teacher::classoff;

    //同理,槽函数也要进行修改
    void (Student:: *studentSlot)(QString)=&Student::run;

    //要先做好连接
    connect(wu,teacherSignal,ming,studentSlot);
    ring();
}

//下课铃响函数,该函数运行后,将触发老师说下课(信号),小明向外跑(槽函数)
void myWidget:: ring()
{
    //释放老师说下课(信号)
    //emit wu->classoff();
    emit wu->classoff("放假");
}

当程序运行后,
在这里插入图片描述
这里需要注意:

1、要先建立连接,再有发生事件。

2、当发生事件后,发送者发送信号,接收者接收到信号后,执行槽函数。

3、需要注意的是槽函数需要与信号一致(参数,返回值)。也就是说如果信号没有返回值,那么槽函数一定没有返回值。如果槽函数有参数,那么信号一定也有参数。因为槽函数中的参数是用来接收信号所带的参数的。

还要注意这里的发生事件( ring函数 )打印出来的是有双引号的。
在这里插入图片描述
为什么会是这样呢?

这是因为

自定义信号中的参数是 QString 类型的

void classoff(QString type);
void myWidget:: ring()
{
    emit wu->classoff("放假");
}

相应的槽函数要遵循与信号一致(参数,返回值)的原则,所以参数也要定义为 QString 类型,正是因为 QString 类型的原因,所以才会有引号。

void run(QString type);
void Student ::run(QString type)
{
    qDebug()<<"抢饭第一名"<<type;
}

如果我不想加这个引号,应该怎么做呢?
要进行格式转换。转换成 char * 类型就不加引号了。
那怎么转换呢?
首先,要明确它不是直接就可以转换的。

而是要先转换成 QByteArray (利用 toUtf8 这个方法)之后,再转化成 char * 类型的。
在这里插入图片描述
在QByteArray 这个类中提供了很多方法,我们的目标是转换为char *
在这里插入图片描述
这里就寻找返回值是 char * 的函数。
在这里插入图片描述

void Student ::run(QString type)
{
    qDebug()<<"抢饭第一名"<<type.toUtf8().data();
}

我们再来运行下程序。
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

xuechanba

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

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

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

打赏作者

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

抵扣说明:

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

余额充值