QT_5(自定义信号和槽发生重载的解决)

自定义函数和槽发生重载的解决

一、

理论部分:

  1. 需要利用函数指针,明确指向函数地址
  2. 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()
{
    
    
}

运行截图:
在这里插入图片描述
二、
在上一部分中运行的结果中食物带了双引号,接下来进行解决此问题
理论部分:

  1. 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的窗口中输入你想要查询的东西即可
在这里插入图片描述
查完之后点击“编辑”重新回到代码编写界面
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45866980/article/details/127039065