Как-то на практике необходимо было реализовать callback’ом метод класса. В Интернете информации было много…но найти я её не смог. Целью данной статьи показать вариант применения callback метода для начинающих программистов.
Кто заинтересовался, прошу под кат
Допустим у нас есть класс виджета, на котором находится прогресс бар:
Мы создаем класс обертку для callback методов
Далее – все просто.
В начале кода прописываем (например, при создании объекта класса VisDialog )
А дальше – передаем в необходимую функцию указатель на метод класса:
Вот, собственно, и всё. Спасибо за внимание.
Кто заинтересовался, прошу под кат
Допустим у нас есть класс виджета, на котором находится прогресс бар:
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));
Вот, собственно, и всё. Спасибо за внимание.