前言

在Qt中传数据,我们使用了一个信号和槽系统,但这并不意味着不能使用旧的经过验证的方法,即使用 CallBack回调函数功能。
事实上使用 CallBack 功能比信号和槽要快一些。并且当发送信号的对象在程序中被销毁并且不再使用时,就信号理想地从槽中分离而言,回调可以更容易使用。


如何使用CallBack工作

假设A类包含B类的对象,B类有动作时想要通知到A类,B类应该有个设置回调函数的接口,A类应该定义相应的回调函数,将函数指针传递给B。

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


程序及解释

源码存放路径

https://github.com/lesliefish/Qt/tree/master/Project/QtGuiApplication/CallBackTest

为了熟悉 CallBack 的工作 ,我们使用具有以下结构的项目:
• mainwindow.h - 主应用程序窗口的头文件;
• mainwindow.cpp - 主应用程序窗口的源文件;
• square.h - 其对象将使用 CallBack 函数的类的头文件 。
• square.cpp - 给定类的源代码文件;


square.h中部分代码:

class Square : public QObject, public QGraphicsItem
{Q_OBJECTpublic: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_OBJECTpublic: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);// 初始化QLineEditline1 = new QLineEdit();line2 = new QLineEdit();// 把两个line 放进gridLayoutui->gridLayout->addWidget(line1, 0, 1);ui->gridLayout->addWidget(line2, 0, 2);// 初始化图形场景m_scene = new QGraphicsScene();       // 设置场景到 graphicsViewui->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()));
}

原文地址:

https://evileg.com/ru/post/89/

在Qt中使用回调函数替代信号槽相关推荐

  1. QT中connect、disconnect和信号槽实现原理

    connect connect用于连接信号和槽函数,但是我们经常忽略最后一个参数,本人在写代码时遇到了bug,选择一个符号进行多次标绘,再选择其他符号时,会将上一次选择的符号也进行标绘,主要时conn ...

  2. C语言中的回调函数(Callback Function)

    C语言中的回调函数(Callback Function) 1 定义和使用场合 回调函数是指 使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中 ...

  3. Java中的回调函数学习-深入浅出

    Java中的回调函数一般来说分为下面几步: 声明回调函数的统一接口interface A.包括方法callback(); 在调用类caller内将该接口设置为私有成员private A XXX; 在c ...

  4. 理解与使用Javascript中的回调函数

    在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被"存储"在变量中,能作为函数参数被传递,能在函数中被创建, ...

  5. 理解javascript中的回调函数(callback)【转】

    在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...

  6. 关于javascript中的回调函数

    关于javascript中的回调函数 原文地址:http://blog.csdn.net/sicluoyi/article/details/1737969 考虑一个这样的例子: 假如某个项目的底层和高 ...

  7. 【JavaScript】理解与使用Javascript中的回调函数

    在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被"存储"在变量中,能作为函数参数被传递,能在函数中被创建, ...

  8. memcpy函数_如何理解c语言中的回调函数

    在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 这段话不是那么好理解,不同语言实现回调的方式有些许不 ...

  9. keras中的回调函数

    keras训练 fit(self, x, y, batch_size=32, nb_epoch=10, verbose=1, callbacks=[], validation_split=0.0, v ...

最新文章

  1. Exchange/Office365 自动处理脚本:环境准备篇(一)
  2. 光源时间_背光源缩短寿命的原因
  3. SpringBoot Test及注解详解(含Mockito)
  4. wordpress 删除自定义字段
  5. 调色板栅格数据使用GDAL时注意
  6. 有向加权图 最大弱连通分支_开盘引来大涨,当下股市最大的风险是它?
  7. docker学习1--dockerfile
  8. 云计算是互联网和计算机技术发展的产物,云计算是网络技术和电脑融合在一起产物...
  9. SQL.变量、运算符、if、while
  10. oracle数据库文件默认的安装位置,Oracle 10g数据库默认安装应该注意的问题
  11. FPGA学习笔记-IP核-FIFO
  12. Map的实现类中,哪些是有序的,哪些是无序的
  13. 0和1在计算机电路中,0和1
  14. 苹果电脑运行3dsmax的三种方法,你知道吗?
  15. 控制器设计与仿真 实验计算机组成,计算机组成原理——微程序控制器实验
  16. python计算学分绩点_使用Python计算研究生学分绩(绩点)
  17. SNA社交网络R语言分析
  18. Vue3使用组件库的tab切换echarts图表,图表出现宽度压缩变窄的问题
  19. 使用WinImage创建新的Image文件
  20. c + easyx 实现放怀旧掌机界面风格俄罗斯方块

热门文章

  1. stc8a_步进电机控制,加减速
  2. 「科普大佬说」 智能仿生机器鱼
  3. 推荐一款Node.js编写的HTTP代理服务器Zan Proxy
  4. getPerspectiveTransform通过4对点确认透视变换矩阵的原理分析
  5. sdutacm-悼念512汶川大地震遇难同胞
  6. 在线解题小程序有哪些功能?
  7. NFLS OJ 1162 暴力
  8. spring中自定义对象交给spring容器管理的4种方式
  9. 《图像处理、分析与机器视觉 第四版》 彩色图像 色彩空间——学习笔记
  10. GIS常用的工具及相关网站