QT信号与槽

Posted RUNA22

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT信号与槽相关的知识,希望对你有一定的参考价值。

自定义信号与槽

需求: 学生向老师打招呼

学生偶遇老师 学生Stuend st 会发出一个信号 sayHi

老师响应信号 Teacher zt 处理信号的槽函数 reply

目录结构

1.建立Student类,定义一个自定义信号

student.h

#ifndef STUDENT_H

#define STUDENT_H

#include <QObject>

class Student : public QObject

Q_OBJECT

public:

explicit Student(QObject *parent = nullptr);

signals:

//自定义信号需要写到signals下

//返回类型必须void

//信号只需要声明不需要实现

//信号可以有参数,可以重载

void Hello();

//重载

void Hello(QString str);

;

#endif // STUDENT_H

2.建立Teacher类,自定义槽函数

teacher.h

#ifndef TEACHER_H

#define TEACHER_H

#include <QObject>

class Teacher : public QObject

Q_OBJECT

public:

explicit Teacher(QObject *parent = nullptr);

signals:

public slots:

//自定义槽函数

//高版本可以写到public下 或者全局函数

//槽函数返回值void

//槽函数需要声明也需要实现

//槽函数可以有参数,可以重载

void reply();

//重载

void reply(QString str);

;

#endif // TEACHER_H

在teacher.cpp中实现

#include "teacher.h"

#include <QDebug>

Teacher::Teacher(QObject *parent) : QObject(parent)

//槽函数实现

void Teacher:: reply()

qDebug() << "you homework is finish?";

void Teacher:: reply(QString str)

// qDebug() << "you "<<str<<"homework is finish?";

//QString 转 char* 先转成QByterray英型再转char * 去掉双引号

qDebug() << "you "<<str.toUtf8().data()<<"homework is finish?";

3.在widget中连接

参数1 信号的发送者 参数2 发送的信号 参数3 信号的接受者 参数4 处理的槽函数(函数地址)

onnect(st, &Student::Hello, zt, &Teacher::reply);

connect(st,SIGNAL(Hello()),zt,SLOT(reply()));

widget.h

#ifndef WIDGET_H

#define WIDGET_H

#include <QWidget>

#include "student.h"

#include "teacher.h"

QT_BEGIN_NAMESPACE

namespace Ui //命名空间

class Widget;//ui_widget.h文件里定义的类 外部声明

QT_END_NAMESPACE

class Widget : public QWidget

Q_OBJECT // 宏,使用QT信号与槽机制必须添加

public:

Widget(QWidget *parent = nullptr);

~Widget();

Teacher * zt;

Student * st;

//偶遇

void crossAbout();

private:

Ui::Widget *ui; //Ui :: Widget类型的一个指针,指向可视化的界面

;

#endif // WIDGET_H

widget.cpp实现

#include "widget.h"

#include "ui_widget.h"

#include <QPushButton>

Widget::Widget(QWidget *parent)

: QWidget(parent)

, ui(new Ui::Widget)

ui->setupUi(this);//实现了组件的各种设置,信号与槽的关联

//this 关闭窗口时会顺便把 st 释放掉

st = new Student(this);

zt = new Teacher(this);

//连接学生与老师

//参数1 信号的发送者 参数2 发送的信号 参数3 信号的接受者 参数4 处理的槽函数(函数地址)

//connect(st, &Student::Hello, zt, &Teacher::reply);

// connect(st,SIGNAL(Hello()),zt,SLOT(reply()));

//有参数,信号与槽连接

//函数指针 执行函数地址

// 当自定义信号和槽出现重载时候,原先写法失效,因为执行的函数地址不明确,

// 解决方法:利用函数指针来明确指向哪个函数的地址。

//void(Student:: *studentSignal)(QString)=&Student::Hello;

// void(Teacher:: *teacherSlot)(QString) =&Teacher::reply;

// connect(st, studentSignal, zt,teacherSlot );

//偶遇

//crossAbout();

//信号和槽的拓展

//1.信号可以连接信号

//2.信号和槽可以断开disconnect

//3.一个信号可以触发多个槽函数

//4.多个信号可以连接同一个槽函数

//5.信号和槽的参数必须一-对应

//信号的参数个数可以大于槽函数的参数个数,反之不可以。

//点击按钮,才偶遇

QPushButton *btn = new QPushButton("偶遇",this);

//触发无参 信号和槽

//1.信号 连接 信号

void(Student:: *noStudentSignal)(void)=&Student::Hello;

void(Teacher:: *noTeacherSlot)(void) =&Teacher::reply;

connect(btn,&QPushButton::clicked,st,noStudentSignal);

connect(st, noStudentSignal, zt,noTeacherSlot );

// connect(btn,&QPushButton::clicked,this,&Widget::close);3.一个信号可以触发多个槽函数

//2.断开信号和槽

// disconnect(st, noStudentSignal, zt,noTeacherSlot );

//重置大小

resize(600,400);

Widget::~Widget()

delete ui;

//偶遇

void Widget::crossAbout()

//触发打招呼的信号

//打招呼属于自定义信号,触发自定义信号关键宇 emit

emit st->Hello();//触发无参数信号

emit st->Hello("语文");

以上是关于QT信号与槽的主要内容,如果未能解决你的问题,请参考以下文章

Qt学习总结(C鱼)之信号与槽01

QT信号槽实现原理

Qt编程中信号与槽机制可以用啥方法替换

怎么理解QT中的信号与槽

QT开发(十三)——QT信号与槽机制

qt 信号与槽