自定义信号槽机制

如果想要在QT类中自定义信号槽, 需要满足一些条件, 并且有些事项也需要注意:

  1. 要编写新的类并且让其继承Qt的某些标准类
  2. 这个新的子类必须从QObject类或者是QObject子类进行派生
  3. 在定义类的头文件中加入 Q_OBJECT 宏
// 在头文件派生类的时候,首先像下面那样引入Q_OBJECT宏:
class MyMainWindow : public QWidget
{
    Q_OBJECT
    ......
}

自定义信号

  1. 信号是类的成员函数
  2. 返回值必须是 void 类型
  3. 信号的名字可以根据实际情况进行指定
  4. 参数可以随意指定, 信号也支持重载
  5. 信号需要使用 signals 关键字进行声明, 使用方法类似于public等关键字
  6. 信号函数只需要声明, 不需要定义(没有函数体实现)
  7. 在程序中发射自定义信号: 发送信号的本质就是调用信号函数
  8. 习惯性在信号函数前加关键字: emit, 但是可以省略不写
  9. emit只是显示的声明一下信号要被发射了, 没有特殊含义
  10. 底层 emit == #define emit
// 举例: 信号重载
// Qt中的类想要使用信号槽机制必须要从QObject类派生(直接或间接派生都可以)
class Test : public QObject
{
    Q_OBJECT
signals:
    void testsignal();
	// 参数的作用是数据传递, 谁调用信号函数谁就指定实参
	// 实参最终会被传递给槽函数
    void testsignal(int a);
};

自定义槽

  1. 返回值必须是 void 类型

  2. 槽也是函数, 因此也支持重载

  3. 槽函数需要指定多少个参数, 需要看连接的信号的参数个数

  4. 槽函数的参数是用来接收信号传递的数据的, 信号传递的数据就是信号的参数

  • 举例:
    信号函数: void testsig(int a, double b);
    槽函数: void testslot(int a, double b);
  • 总结:
    槽函数的参数应该和对应的信号的参数个数, 从左到右类型依次对应
    信号的参数可以大于等于槽函数的参数个数 == 信号传递的数据被忽略了
    信号函数: void testsig(int a, double b);
    槽函数: void testslot(int a);
  1. Qt中槽函数的类型是多样的
    Qt中的槽函数可以是类的成员函数、全局函数、静态函数、Lambda表达式(匿名函数)

  2. 槽函数可以使用关键字进行声明: slots (Qt5中slots可以省略不写)

  • public slots:
  • private slots: –> 这样的槽函数不能在类外部被调用
  • protected slots: –> 这样的槽函数不能在类外部被调用
// 槽函数书写格式举例
// 类中的这三个函数都可以作为槽函数来使用
class Test : public QObject
{
    public:
    void testSlot();
    static void testFunc();

    public slots:
    void testSlot(int id);
};

自定义信号和槽函数的使用

信号的参数主要是用于参数传递,传递到槽函数的参数里面去的。

先新建发射信号的类
在这里插入图片描述

在这里插入图片描述
继承QObject
(friend是关键字。。不能使用friend来命名类)
在这里插入图片描述
再新建一个接受信号的槽函数类:
在这里插入图片描述

信号类中定义的信号函数:
在这里插入图片描述
槽函数类中的槽函数声明:
在这里插入图片描述
槽函数定义:
在这里插入图片描述
将信号类和槽函数类在mainwindow中实例化。。并绑定
头文件中声明:
在这里插入图片描述
cpp中的定义
在这里插入图片描述

现在的关键问题是什么时候调用myFriend::sendMseeage信号函数,怎么调用myFriend::sendMseeage信号函数。

解决办法

在mainwindow中,在定义一个button按钮,发送信号,mainwindow接受信号,并调用myFriend::sendMseeage函数。

在这里插入图片描述

在这里插入图片描述
此时,button的click为信号函数,mainwindow中需要定义槽函数。

mainwindow代码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "me.h"
#include "myfriend.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    //定义信号类和槽函数类的指针
    myFriend* myfriend;
    me* tom;
//槽函数
public slots:
    void receivebutton();  //槽函数声明(需要定义)

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

定义:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QDebug"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{

    ui->setupUi(this);
    connect(ui->deleteWindow,&QPushButton::clicked,this,&MainWindow::close);
    //在mainwindow中将myfriend的信号函数和me的槽函数绑定 (关键在于自定义信号myFriend::sendMseeage的调用)
    myfriend = new myFriend(this);
    tom = new me(this);
    connect(myfriend,&myFriend::sendMseeage,tom,&me::receiveMessage);
    //再将button点击的信号函数和mainwindow中的receivebutton槽函数绑定
    connect(ui->sendMessage,&QPushButton::clicked,this,&MainWindow::receivebutton);



}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::receivebutton()
{
    qDebug()<<"点击了一下";
    //调用信号函数&myFriend::sendMseeage (myFriend 指针得在头文件中定义,不让调用不了,尴尬。。)
    myfriend->sendMseeage();
}

做为button的槽函数(在槽函数中,调用myfriend的信号函数)
在这里插入图片描述

绑定:

    //再将button点击的信号函数和mainwindow中的receivebutton槽函数绑定
    connect(ui->sendMessage,&QPushButton::clicked,this,&MainWindow::receivebutton);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值