Как стать автором
Обновить

Callback метод класса на примере Qt

Как-то на практике необходимо было реализовать callback’ом метод класса. В Интернете информации было много…но найти я её не смог. Целью данной статьи показать вариант применения callback метода для начинающих программистов.
Кто заинтересовался, прошу под кат

Допустим у нас есть класс виджета, на котором находится прогресс бар:
VisDialog.h:
#ifndef VISDIALOG_H
#define VISDIALOG_H

#include <QWidget>

namespace Ui {
class VisDialog;
}

class VisDialog : public QWidget
{
  Q_OBJECT

public:

  explicit VisDialog(QWidget *parent = 0);
  ~VisDialog();

public slots:

  void setProgress(int progress); //сам метод изменения значения прогресс бара

private slots:
  void on_progressBar_valueChanged(int value);
private:
  Ui::VisDialog *ui;
};

#endif // VISDIALOG_H



VisDialog.cpp:
#include "GUI/VisDialog.h"
#include "ui_VisDialog.h"

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

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


void VisDialog::setProgress(int progress)
{
  ui->progressBar->setValue(progress);
}

void VisDialog::on_progressBar_valueChanged(int value)
{
  if (value == 100)
    this->hide();
}


Мы создаем класс обертку для callback методов
CbConnecter.h
#ifndef CBCONNECTER_H
#define CBCONNECTER_H

#include "GUI/VisDialog.h"  // подключаем нужный хидерник, 

class connecter{
public:
static void setPtr(VisDialog *ptr);  //указываем указатель на объект
static void setProgress(int progress);  //делаем статический метод
private:
static VisDialog* m_dialogPtr;  // собственно указатель на сам объект
};

namespace Ui {
class CBConnecter;
}

class CBConnecter
{
public:
  CBConnecter();
};

#endif // CBCONNECTER_H


CbConnecter.cpp:
#include "Core/CBConnecter.h"

VisDialog* connecter::m_dialogPtr = NULL;

void connecter::setPtr(VisDialog *ptr)
{
  m_dialogPtr = ptr;
}

void connecter::setProgress(int progress)
{
  m_dialogPtr->setProgress(progress);
}

CBConnecter::CBConnecter()
{}


Далее – все просто.
В начале кода прописываем (например, при создании объекта класса VisDialog )
VisDialog  *m_VisualDialog = new VisDialog();

connecter::setPtr( m_VisualDialog );


А дальше – передаем в необходимую функцию указатель на метод класса:
map->openImage(&connecter::setProgress);
//где прототип map->openImage      =   void openImage(void (*p_func_Progress)(int));



Вот, собственно, и всё. Спасибо за внимание.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.