QT C++类成员函数如何作为回调函数?

在c++里,当设计一个底层类的时候,下游不知道上游具体的类是什么,又需要调上游的方法(比如通过通信获取到了数据,需要将数据回传到上游),解决方法是将上游类的成员函数(其他函数同理)充当回调函数,传递给下游。

上游类:mainwindow

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 

class ServerProvider;

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow {
  Q_OBJECT

 public:
  MainWindow(QWidget *parent = nullptr);
  ~MainWindow() override;

  void getData(const QString &str);

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


#include "mainwindow.h"

#include 

#include "serverprovider.h"
#include "ui_mainwindow.h"

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

  FuncDef func;
  func = std::bind(&MainWindow::getData, this, std::placeholders::_1);

  m_serverProvider = new ServerProvider();
  m_serverProvider->setFunc(func);
}

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

void MainWindow::getData(const QString &str) {
  qDebug() << "GET DATA: " << str;
}

下游类:serverprovider

#ifndef SERVERPROVIDER_H
#define SERVERPROVIDER_H

#include 

class QString;

typedef std::function FuncDef;

class ServerProvider {
 public:
  ServerProvider();
  void setFunc(FuncDef func);

 private:
  FuncDef m_func;
};

#endif  // SERVERPROVIDER_H

#include "serverprovider.h"

#include 

ServerProvider::ServerProvider() {}

void ServerProvider::setFunc(FuncDef func) {
  this->m_func = func;

  //假设此处获得数据
  //(实际场景这个方法只做setFunc,应该是在某个触发条件下调用m_func)
  QString str = "Hello World!";

  this->m_func(str);
}

你可能感兴趣的:(c++qt)