信号与槽作为qt中的核心机制,在qt应用开发中经常会用的,但是原生的信号与槽连接传参,只支持基本的数据类型,比如char,int, float,double。
如果想要在信号与槽之间传递自定义参数,比如结构体,类等,就必须特别注意,因为在编译的时候不会报错,但是在执行的时候会报错,出现失效。
解决办法如下
#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类中加入重载信号void Hungry(QString foodName);
#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
signals:
public slots:
void Treat();
void Treat(QString foodname);
};
#endif // STUDENT_H
#include "student.h"
#include <QDebug>
Student::Student(QObject *parent) : QObject(parent)
{
}
void Student::Treat()
{
qDebug("请老师吃饭");
}
void Student::Treat(QString foodname)
{
qDebug()<<foodname;
}
同样在student类中加入重载槽
使用时 emit tc->Hungry("宫保鸡丁"); 就可以触发带参数的信号了
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//创建一个老师对象
this->tc = new Teacher(this);
//创建一个学生对象
this->st = new Student(this);
//老师饿了 学生请客连接==
//connect(tc, &Teacher::Hungry, st, &Student::Treat);
//调用下课函数
//classIsOver();
//使用指针指向地址,使用函数指针
void(Teacher::*teachersignal)(QString) = &Teacher::Hungry;
void(Student::*studentslot)(QString) = &Student::Treat;
connect(tc,teachersignal, st, studentslot);
classIsOver();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::classIsOver()
{
// emit tc->Hungry(); //成功触发 使用emit关键字
emit tc->Hungry("宫保鸡丁"); //成功触发 使用emit关键字
//你是看的啥写的 wan'qu'na
}
void(Teacher::*teachersignal)(QString) = &Teacher::Hungry;
void(Student::*studentslot)(QString) = &Student::Treat;
函数指针基础:
1. 获取函数的地址
2. 声明一个函数指针
3.使用函数指针来调用函数