QT从入门到实战x篇_07_自定义信号及槽的重载(带参数的信号和槽的使用方法;将QString转换为Char*的结果)

上篇QT从入门到实战x篇_06_信号和槽2:自定义信号和槽函数的创建及使用介绍了自定义信号和槽的创建及使用方法,本篇将会介绍自定义信号及槽的重载。

关于重载请参考之前文章:C++57个入门知识点_12 函数重载及其条件(函数重载:同一作用域中有多个同名函数、条件:(1)函数名相同(2)参数个数不同、类型不同、顺序不同(3)返回值和调用约定不考虑(4)作用域相同)
C++57个入门知识点_13 函数重载调用规则及本质(编译器会按照匹配程度来决定调用哪个函数,最匹配的优先调用,而经过名称粉碎之后,其实不同的同名函数是存在差异的)

上篇下课后 老师触发信号 饿了 学生响应信号 请客吃饭,但是并没有明确指出老师饿了要吃什么饭,此处对teacher.h中的信号进行重载,介绍带参数的信号和槽的使用和将QString转换为Char*的结果

1. 带参数的信号


teacher类中定义信号函数, teacher.h中的内容:

signal:
void hungry(QString foodName);

2. 带参数的槽函数


student类中定义信号函数, student.h中的进行声明:

public:
    void treat(QString foodName);

使用“alt+回车”快捷键创建实现

student.cpp中:

#include "student.h"
#include <QDebug>

Student::Student(QObject *parent) : QObject(parent)
{

}

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

void Student::treat(QString foodName)
{
     qDebug()<<QString::fromLocal8Bit("下课了,老师要吃")<<foodName;
}

3. 连接带参数的信号和槽


widget.cpp:利用函数指针指向函数地址,函数指针定义时写明参数。

函数指针部分参考:C语言基础入门48篇_38_函数指针与typedef(函数指针即指向函数的指针、函数指针定义int (*pfn)(int)、typedef给数据类型起别名,起到的作用一致、typedef简化函数指针)

    //函数指针指向函数地址
    void(Teacher::*teacherSignal)(QString)=&Teacher::hungry;
    void(Student::*studentSlot)(QString)=&Student::treat;
    connect(zt,teacherSignal,st,studentSlot);
#include "widget.h"
#include "ui_widget.h"
#include "teacher.h"
#include "student.h"

//Teacher类 老师类
//Student类 学生类
//场景:下课后 老师触发信号 饿了 学生响应信号 请客吃饭

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //创建老师对象
    zt=new Teacher(this); //this用来指定父亲的对象
    //创建学生对象
    st=new Student(this);

    //老师饿了 学生请客连接
//    connect(zt,&Teacher::hungry,st,&Student::treat);

    //函数指针指向函数地址
    void(Teacher::*teacherSignal)(QString)=&Teacher::hungry;
    void(Student::*studentSlot)(QString)=&Student::treat;
    connect(zt,teacherSignal,st,studentSlot);


    //调用下课函数
    classIsOver();
}

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

void Widget::classIsOver()
{
    //下课函数 调用后 触发老师饿了的信号
    emit zt->hungry(QString::fromLocal8Bit("宫保鸡丁"));
}

运行结果:
在这里插入图片描述

4. 将QString转换为Char*


上面程序在做输出时,由于输出的数据类型为 QString,因此会带着 双引号输出,可以通过将其转换为 char*进行输出,就不会带双引号。对应的

student.cpp的槽函数中

void Student::treat(QString foodName)
{
    //QString转char*,先转为QByteArray(.toUtf8()),再转为char*(.data())
    qDebug()<<QString::fromLocal8Bit("下课了,老师要吃").toUtf8().data()<<foodName.toUtf8().data();
}

运行结果:
在这里插入图片描述

5.学习视频地址:QT从入门到实战x篇_07_自定义信号及槽的重载

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十月旧城

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

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

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

打赏作者

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

抵扣说明:

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

余额充值