• 【QT】回调函数的实现


    回调函数是你写一个函数,让预先写好的系统来调用。你调用系统的函数,是直调。让系统调用你的函数,就是回调。

    A 让 B 做事,根据粒度不同,可以理解成 A 函数调用 B 函数,或者 A 类使用 B 类,或者 A 组件使用 B 组件等等。反正就是 A 叫 B 做事。当 B 做这件事情的时候,自身的需要的信息不够,而 A 又有。就需要 A 从外面传进来,或者 B 做着做着再向外面申请。对于 B 来说,一种被动得到信息,一种是主动去得到信息。有些人给这两种方式一个术语,叫信息的压送( push),和信息的拉取( pull)。

    1、callback.h

    #ifndef CALLBACK_H
    #define CALLBACK_H
    
    /*A 让 B 排序,B 会做排序,但排序需要知道哪个比哪个大,
     * 这点 B 自己不知道,就需要 A 告诉它。而判断大小本身是某种行为,
     * 既然 C 语言中不可以传进第一值的函数,就设计成传递第二值的函数指针,
     * 这个函数指针是 A 传向 B 的信息,用于描述判断大小这种行为。
     * 这里本来 A 调用 B 的,结果 B 又调用了 A 告诉它的信息,也就是 callback
    */
    
    #include 
    
    typedef double(*cbFunc)(double,double);      //函数指针
    
    class CallBack : public QWidget
    {
        Q_OBJECT
    public:
        explicit CallBack(QWidget *parent = nullptr);
    
        void m_getData(cbFunc);       //调用回调函数
    
    signals:
    
    public slots:
    };
    
    #endif // CALLBACK_H
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    2、callback.cpp

    #pragma execution_character_set("utf-8")
    #include "callback.h"
    #include 
    
    CallBack::CallBack(QWidget *parent) : QWidget(parent)
    {
    
    }
    
    void CallBack::m_getData(cbFunc m_cbFunc)
    {
        double i = m_cbFunc(3.6,5.7);
        qDebug() << "回调函数返回的数值: " << i;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    3、widget.h

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include 
    #include "callback.h"
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        Widget(QWidget *parent = nullptr);
        ~Widget();
    
        CallBack m_callback;
    
        static double m_getPosition(double a, double b);
    
    };
    
    #endif // WIDGET_H
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    4、widget.cpp

    #pragma execution_character_set("utf-8")
    #include "widget.h"
    #include 
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
    {
        //通过传参的形式将该函数的地址传递给其他函数,然后在其他函数中通过函数指针调用该函数 --回调
        m_callback.m_getData(&m_getPosition);
    }
    
    Widget::~Widget()
    {
    
    }
    
    double Widget::m_getPosition(double a, double b)
    {
        qDebug() << "回调函数触发传入的数值是: " << a << b;
        return a+b;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    5、运行结果输出

    在这里插入图片描述

  • 相关阅读:
    odoo 开发入门教程系列-一些用户界面
    单位换算表大全
    基于SSM的计算机技术论坛管理系统,高质量论文范例,可拿去就用
    MySQL8重置root账户密码图文教程
    【C++】类和对象(下)
    ABAP接口部分-Web Service提供者与消费者
    Selenium+Python做web端自动化测试框架实战
    【操作系统】24王道考研笔记——第四章 文件管理
    nginx负载均衡和高可用
    Eclipse中常用的操作单词
  • 原文地址:https://blog.csdn.net/Cappuccino_jay/article/details/126162571