关于c++:QT-C类成员函数如何作为回调函数

2次阅读

共计 1415 个字符,预计需要花费 4 分钟才能阅读完成。

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

上游类:mainwindow

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

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 <functional>

#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 <functional>

class QString;

typedef std::function<void(const QString &str)> FuncDef;

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

 private:
  FuncDef m_func;
};

#endif  // SERVERPROVIDER_H

#include "serverprovider.h"

#include <QString>

ServerProvider::ServerProvider() {}

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

  // 假如此处取得数据
  //(理论场景这个办法只做 setFunc, 应该是在某个触发条件下调用 m_func)
  QString str = "Hello World!";

  this->m_func(str);
}

正文完
 0