上篇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_自定义信号及槽的重载