自定义函数和槽发生重载的解决
一、
理论部分:
- 需要利用函数指针,明确指向函数地址
- void (Teacher::*tSignal)(QString)=&Teacher::hungry;(详见下文代码处)
实际案例:
示例:老师饿了,老师饿了吃烧茄子
在tacher、student、连接窗口mywidget中的处理如下代码所示:
teacher.h
#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);
};
#endif // TEACHER_H
teacher.cpp
#include "teacher.h"
Teacher::Teacher(QObject *parent) : QObject(parent)
{
}
student.h
#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
//槽函数:无返回值,需要声明也需要实现
//可以有参数可以发生重载
void treat();
void treat(QString foodName);
signals:
//有些QT版本里面会有一行这样的代码
//public slots:
//这行代码是用来当作槽来使用的,5.4版本后也可以将槽的代码直接写在public下,早期版本一定要写在此处
};
#endif // STUDENT_H
student.cpp
#include "student.h"
#include<QDebug>//打印的头文件
Student::Student(QObject *parent) : QObject(parent)
{
}
void Student::treat(QString foodName)
{
qDebug()<<"请老师吃"<<foodName;
}
mywidget.cpp
//这是窗口界面
#include "mywidget.h"
#include<QPushButton>//按钮的头文件
#include"teacher.h"
#include"student.h"
myWidget::myWidget(QWidget *parent)
: QWidget(parent)//初始化列表
{
//创建一个老师对象
this->zt=new Teacher(this);//this(括号里面的)加不加都行,加上了表示对象树就不用考虑释放的问题了
//创建一个学生对象
this->st=new Student(this);
//链接带参数的信号和槽
//指针->地址
//函数指针->函数地址
void(Teacher:: *teachersiganl)(QString)=&Teacher::hungry;
void(Student:: *studentsignal)(QString)=&Student::treat;
//老师饿了,学生请客的链接;
connect(zt,teachersiganl,st,studentsignal);
//调用下课函数
classIsOver();
}
void myWidget:: classIsOver()
{
//下课函数,调用后触发老师饿了
emit zt->hungry("烧茄子");
}
myWidget::~myWidget()
{
}
运行截图:
二、
在上一部分中运行的结果中食物带了双引号,接下来进行解决此问题
理论部分:
- QString转换成char *
1.1 利用.toUtf8()转为QByteArray
1.2 .利用data()转为char *
实例演示:
示例:老师饿了,要吃烧茄子
各部分代码如下所示:
只需要更改mywidget.cpp文件
#include "student.h"
#include<QDebug>//打印的头文件
Student::Student(QObject *parent) : QObject(parent)
{
}
void Student::treat(QString foodName)
{
//QString->char*,先转成QByteArray(.toUtf8)再转成char *()
qDebug()<<"请老师吃"<<foodName.toUtf8().data();
}
运行截图:
补充
打开QT助手的方法:
“帮助”->“索引”
在look for的窗口中输入你想要查询的东西即可
查完之后点击“编辑”重新回到代码编写界面