Qt之回调函数:5 回调函数的注册

注册回调函数实现方法

版权声明:本文主要内容均来自 世外桃源 的原创文章,遵循 CC 4.0 BY-SA 版权协议。
原文出处链接:https://blog.csdn.net/qq_14820081/article/details/89231995

回调函数的注册

在c++中,注册函数的参数是回调函数指针。

解释

以层次模型来解释:

​ 注册函数所在的类,是调用回调函数的决定者【下层】,决定何时何种条件下去调用回调函数。而真正实现回调函数功能的类【上层】,不会直接调用该回调函数。

​ 一般来说,会把【上层的】回调函数通过【下层的】注册函数,保存在注册函数所在类的成员变量【下层】中,在适当的时候,【下层】通过该成员变量去访问注册过的回调函数。在c++中,该成员变量是同种类型的函数指针。

​ 加入了一些定语,是不是就层次分明了?!!🤣

代码实现

说明:大佬的代码也挺完美的,我只是按照自己的理解和思路,拆分了一下。

模拟下层的函数库

lib.h

#pragma once
#include <stdio.h>
#include <functional>
typedef std::function <void () > CallBack;		// 定义函数类型
void hook() ;                                           // 执行回调函数
void register_hook_callback(CallBack p_callback);        // 只是提供一个注册函数

lib.cpp

#include "lib.h"

CallBack p[5] = { NULL }; // 创建一个函数指针数组

void hook() // 官方封装起来
{
    int i = 0;
    for (i = 0; i < 5; i++) {
        if (p[i] != NULL) {
            p[i]();
        }
    }
}

void register_hook_callback(CallBack p_callback) // 只是提供一个注册函数
{
    int i = 0;
    for (i = 0; i < 5; i++) {
        if (p[i] == NULL) {
            p[i] = p_callback;
            break;
        }
    }
}

模拟上层的函数 main.cpp

#include <functional>
#include <windows.h>
#include "lib.h"
using namespace std;

void test01();
void test02();

int main()
{
    register_hook_callback(test01);
    register_hook_callback(test02);
    while(1)
    {
        hook();
        printf("=====运行========\n");
        Sleep(1000);
    }
}

// 上层用户自己要定义回调函数
void test01()  
{
    printf("\ntest01 callback\n");
}
void test02()
{
    printf("\ntest02 callback\n");
}

总结

​ 还是以层次模型为解,注册只是让下层拥有上层定义的函数指针,不一定局限于使用函数,也可以直接赋值。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,可以使用函数指针或者函数对象来实现回调函数的建立和绑定。而在使用QT框架中,可以使用信号和槽机制来实现回调函数的功能。 1. 使用函数指针建立回调函数: 首先,定义一个函数指针类型,该函数指针类型与回调函数的函数签名相匹配。然后,将回调函数的地址赋值给函数指针变量。最后,在需要调用回调函数的地方,通过函数指针来调用回调函数。 示例代码如下: ```cpp // 定义回调函数的函数签名 typedef void (*CallbackFunc)(int); // 回调函数 void callback(int data) { // 回调函数的实现 // ... } int main() { // 建立回调函数 CallbackFunc func = callback; // 调用回调函数 func(10); return 0; } ``` 2. 使用函数对象建立回调函数: 可以定义一个函数对象类,并重载函数调用运算符(operator()),使其具有类似函数的行为。然后,将函数对象作为参数传递给需要回调的函数或者类的成员函数。 示例代码如下: ```cpp // 定义函数对象类 class Callback { public: void operator()(int data) { // 回调函数的实现 // ... } }; int main() { // 建立回调函数 Callback callback; // 调用回调函数 callback(10); return 0; } ``` 3. 使用QT的信号和槽机制建立回调函数: 在QT中,可以使用信号和槽机制来实现回调函数的功能。首先,在需要回调的类中定义一个信号,然后在另一个类中定义一个槽函数,并将信号与槽函数进行连接。当信号被触发时,槽函数会被自动调用。 示例代码如下: ```cpp // 定义一个发送信号的类 class Sender : public QObject { Q_OBJECT signals: void dataReady(int data); }; // 定义一个接收信号的类 class Receiver : public QObject { Q_OBJECT public slots: void onDataReady(int data) { // 回调函数的实现 // ... } }; int main() { // 创建发送信号的对象和接收信号的对象 Sender sender; Receiver receiver; // 连接信号和槽函数 QObject::connect(&sender, SIGNAL(dataReady(int)), &receiver, SLOT(onDataReady(int))); // 触发信号,调用回调函数 emit sender.dataReady(10); return 0; } ``` 以上是建立和绑定回调函数的几种常见方法。具体选择哪种方法取决于你的需求和代码结构。如果你有其他问题,请继续提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值