回调函数应用场景

        回调函数(Callback Function)是一种编程模式,其中一个函数(称为回调函数)作为参数传递给另一个函数,并在需要时被调用。这种模式在多种编程语言和框架中都广泛使用,特别是在异步编程和事件驱动编程中。

1 示例--排序(升序、降序)、过滤函数

#include <iostream>  
#include <vector>  
#include <algorithm>  
  
// 回调函数类型定义,接受一个int参数并返回一个bool值  
typedef bool (*FilterFunction)(int);  
  
// 一个函数,接受一个整数数组和一个回调函数  
void FilterArray(const std::vector<int>& array, FilterFunction filter) {  
    std::vector<int> filtered_array;  
    std::copy_if(array.begin(), array.end(), std::back_inserter(filtered_array), filter);  
      
    // 打印过滤后的数组  
    for (int value : filtered_array) {  
        std::cout << value << " ";  
    }  
    std::cout << std::endl;  
}  
  
// 回调函数示例:只接受偶数  
bool IsEven(int value) {  
    return value % 2 == 0;  
}  
  
// 回调函数示例:只接受大于10的数  
bool IsGreaterThanTen(int value) {  
    return value > 10;  
}  
  
int main() {  
    std::vector<int> numbers = {1, 2, 3, 4, 5, 11, 12, 13, 14, 20};  
      
    // 使用IsEven作为回调函数过滤偶数  
    FilterArray(numbers, IsEven);  
      
    // 使用IsGreaterThanTen作为回调函数过滤大于10的数  
    FilterArray(numbers, IsGreaterThanTen);  
      
    return 0;  
}

打印输出

2 示例--图形用户界面回调

        在图形用户界面(GUI)编程中,回调函数是一种非常常见且重要的概念。回调函数允许程序员定义一个函数,这个函数可以在某个特定事件发生时由GUI库自动调用。这些事件可以包括按钮点击、鼠标移动、键盘按键、窗口大小改变等。

        回调函数的主要目的是提供一种灵活的方式来处理这些事件。你可以定义不同的回调函数来处理不同类型的事件,这些函数可以执行你需要的任何操作,比如更新屏幕上的内容、保存数据、启动动画等。

        例如,将使用一个类,在图形场景中绘制一个正方形,并由W,A,S,D键控制。移动时,正方形必须将其坐标的数据发送到创建它的类。也就是说,它应该把这个类的函数作为它的 CallBack 函数。要做的程序效果如下,通过WASD控制方块移动,主窗口接收正方形的位置信息,并将位置信息填入QLineEdit:
这里写图片描述

 • mainwindow.h - 主应用程序窗口的头文件;
• mainwindow.cpp - 主应用程序窗口的源文件;
• square.h - 其对象将使用 CallBack 函数的类的头文件 。
• square.cpp - 给定类的源代码文件;

square.h中部分代码:

class Square : public QObject, public QGraphicsItem
{
    Q_OBJECT

public:
    explicit Square(QObject *parent = 0);
    ~Square();

    // 设置回调函数的函数
    void setCallbackFunc(void(*func) (QPointF point));

protected:
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);

private:
    QTimer * m_timer;

    void(*m_callbackFunc)(QPointF point);

private slots:
    void slotTimer();
};

square.cpp中部分代码:

Square::Square(QObject *parent)
    : QObject(parent), QGraphicsItem()
{
    m_timer = new QTimer();
    connect(m_timer, &QTimer::timeout, this, &Square::slotTimer);
    m_timer->start(1000 / 33);
}

Square::~Square()
{
}

void Square::setCallbackFunc(void(*func) (QPointF point))
{
    m_callbackFunc = func;
}

QRectF Square::boundingRect() const
{
    return QRectF(-15, -15, 30, 30);
}

void Square::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->setPen(Qt::black);
    painter->setBrush(Qt::green);
    painter->drawRect(-15, -15, 30, 30);

    Q_UNUSED(option);
    Q_UNUSED(widget);
}

void Square::slotTimer()
{
    // 根据按钮触发情况移动正方形
    if (GetAsyncKeyState('A')) 
    {
        this->setX(this->x() - 2);
    }
    if (GetAsyncKeyState('D')) 
    {
        this->setX(this->x() + 2);
    }
    if (GetAsyncKeyState('W')) 
    {
        this->setY(this->y() - 2);
    }
    if (GetAsyncKeyState('S')) 
    {
        this->setY(this->y() + 2);
    }
    // 调用回调函数传递正方形位置  类似于发信号给mainwindow  由mainwindow执行相应槽函数
    m_callbackFunc(this->pos());
}

mainwindow.h部分代码:

class MainWindow : public QWidget
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = Q_NULLPTR);
    ~MainWindow();

private:
    Ui::MainWindow* ui;

    QGraphicsScene* m_scene;
    Square *m_square;           // 声明正方形 传输回调
    static QLineEdit *line1;    // 声明一个静态QLineEdit, 执行回调
    static QLineEdit *line2;    // 声明一个静态QLineEdit, 执行回调

private:
    // 声明一个回调函数
    static void getPosition(QPointF point);
};

mainwindow.cpp部分代码:

QLineEdit * MainWindow::line1;
QLineEdit * MainWindow::line2;

MainWindow::MainWindow(QWidget *parent)
    : QWidget(parent)
{
    ui = new Ui::MainWindow();
    ui->setupUi(this);

    // 初始化QLineEdit
    line1 = new QLineEdit();
    line2 = new QLineEdit();

    // 把两个line 放进gridLayout
    ui->gridLayout->addWidget(line1, 0, 1);
    ui->gridLayout->addWidget(line2, 0, 2);

    // 初始化图形场景
    m_scene = new QGraphicsScene();       
    // 设置场景到 graphicsView
    ui->graphicsView->setScene(m_scene);  
    m_scene->setSceneRect(0, 0, 300, 300);
    m_square = new Square();
    // 将getPosition设置回调  接收m_square传入的数据
    m_square->setCallbackFunc(getPosition);       
    m_square->setPos(100, 100);
    m_scene->addItem(m_square);
}

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

/** 
 * @fn     MainWindow::getPosition
 * @brief  回调函数接收正方形位置 写入两个lineEdit
 * @param  QPointF point
 * @return void
 */
void MainWindow::getPosition(QPointF point)
{
    line1->setText(QString::number(point.x()));
    line2->setText(QString::number(point.y()));
}

参考:

Qt/C++ - Урок 026. Применение CallBack функции

 在Qt中使用回调函数替代信号槽_qt中的槽函数类似回调函数嘛-CSDN博客