Qt -自定义信号和槽函数

自定义槽函数

在Qt5中,任意的成员函数,普通全局函数,静态函数都可以是自定义槽函数,也就是说自定义槽函数,与普通函数的用法一致。
但是,需要注意的是槽函数需要与信号一致(参数,返回值),由于信号没有返回值,所以槽函数一定没有返回值。

自定义槽函数的步骤如下:
首先,在头文件中进行声明,这里是mainwidget.h,定义的槽函数为mySlot

#define MAINWIDGET_H

#include <QWidget>
#include <QPushButton>

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = 0);
    ~MainWidget();

    void mySlot();

private:
    QPushButton b1;
    QPushButton *b2;
};

#endif // MAINWIDGET_H

然后在源文件中使用它,这里是mainwidget.cpp,使用的对象是指针类型,通过new定义在堆上的。

 /* 自定义槽
     * 在Qt5中,任意的成员函数,普通全局函数,静态函数都可以是自定义槽函数,
     * 也就是说自定义槽函数,与普通函数的用法一致。
     * 但是,需要注意的是槽函数需要与信号一致(参数,返回值)
     * 由于信号没有返回值,所以槽函数一定没有返回值。
     */
     connect(b2,&QPushButton::released,this,&MainWidget::mySlot);

     connect(b2,&QPushButton::released,&b1,&QPushButton::hide);
}

void MainWidget::mySlot()
{
     b2->setText("Open");
}

自定义信号

下面,来实现一个场景,下课铃响了,老师说下课,小明往外跑。

准备:创建两个类,Teacher类和Student类

先按照前面的方法创建两个类
需要注意,这两个类并不属于任意一种控件,所以直接选择最高的基类,即QObject,结合前面对象树说的,可以不用管它的释放操作。
在这里插入图片描述
创建完毕之后。

在 Teacher.h 中,

信号没有返回值,只需要声明,不需要实现。可以有参数,也可以发生重载。

#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>

class Teacher : public QObject
{
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = nullptr);

signals:
    //自定义信号 写到signals下
    //返回值是void,只需要声明,不需要实现
    //可以有参数,可以重载
    void classoff();

    void classoff(QString type);

};

#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);

signals:

public slots:
    //早期的Qt版本 自定义槽函数必须写到public slots下
    //高级的Qt版本 自定义槽函数可以写到public slots、public下或全局作用域下
    //返回值 void ,需要声明,也需要实现
    //可以有参数,也可以发生重载
    void run();

    void run(QString type);

};

#endif // STUDENT_H

在 Student.cpp 中

#include "student.h"
#include <QDebug>
Student::Student(QObject *parent) : QObject(parent)
{

}
void Student ::run()
{
    qDebug()<<"抢饭第一名";
}

void Student ::run(QString type)
{
    qDebug()<<"抢饭第一名:"<<type.toUtf8().data();
}

在 myWidget.h 中先声明出一个 Teacher 类的对象和一个 Student 类的对象。
这里声明为 private 下,当然也可以声明为 public 下。

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget> //包含头文件 QWidget 窗口类
#include "teacher.h"
#include "student.h"

class myWidget : public QWidget //继承,继承的语法要和初始化列表的语法区分
{
    Q_OBJECT //Q_OBJECT宏,用来支持类中使用信号与槽机制

public:
    //有参构造函数,默认参数在声明和实现只能有一个
    myWidget(QWidget *parent = nullptr);
    ~myWidget();//析构函数
private:
    Teacher * wu;
    Student * ming;

    void ring();
};
#endif // MYWIDGET_H

再在 myWidget.cpp 对这一个 Teacher 类的对象和一个 Student 类的对象进行初始化。

myWidget::myWidget(QWidget *parent)
    : QWidget(parent)//这个在C++语法中被称为初始化列表
{
	//创建一个老师的对象
    this ->wu =new Teacher(this);
    //创建一个学生的对象
    this ->ming =new Student(this);
    //下课铃响了(相当于是按键的点击事件),老师(信号的发送者)说下课(信号),小明(信号的接收者)往外跑(槽函数)。
    connect(wu,&Teacher::classoff,ming,&Student::run);
    ring();
    //思考,如果把 ring 放到 connect 的前面还会打印出来信息吗?
    //答案是否定的。必须先连接再触发。
}

//下课铃响函数,该函数运行后,将触发老师说下课(信号),小明向外跑(槽函数)
void myWidget:: ring()
{
    //释放老师说下课(信号)
    emit wu->classoff();
}
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuechanba

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值