转自:https://blog.csdn.net/yangyang031213/article/details/80716226
头文件,消息定义,函数指针声明、处理函数声明、消息产生函数声明:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDebug>
#include <map>
namespace Ui {
class MainWindow;
}
enum Msg //消息声明
{
Msg_0 = 0,
Msg_1,
Msg_2,
Msg_3,
Msg_4,
Msg_5
};
class MainWindow : public QMainWindow
{
Q_OBJECT
typedef void (MainWindow::*pMsgFunc)(QString & msg);
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_btn_0_clicked(); //产生消息
void on_btn_1_clicked();
void on_btn_2_clicked();
void on_btn_3_clicked();
void on_btn_4_clicked();
void on_btn_5_clicked();
private:
void Processer(Msg msg,QString str); //处理函数
void MsgFunc0(QString & str);
void MsgFunc1(QString & str);
void MsgFunc2(QString & str);
void MsgFunc3(QString & str);
void MsgFunc4(QString & str);
void MsgFunc5(QString & str);
private:
Ui::MainWindow *ui;
std::map<Msg,pMsgFunc> m_map;
};
#endif // MAINWINDOW_H
cpp中初始化消息映射关系,在实现各种函数:
#include "MainWindow.h"
#include "ui_MainWindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_map.insert(std::make_pair(Msg_0,reinterpret_cast<pMsgFunc>(&MainWindow::MsgFunc0))); //初始化消息到处理函数的映射
m_map.insert(std::make_pair(Msg_1,reinterpret_cast<pMsgFunc>(&MainWindow::MsgFunc1)));
m_map.insert(std::make_pair(Msg_2,reinterpret_cast<pMsgFunc>(&MainWindow::MsgFunc2)));
m_map.insert(std::make_pair(Msg_3,reinterpret_cast<pMsgFunc>(&MainWindow::MsgFunc3)));
m_map.insert(std::make_pair(Msg_4,reinterpret_cast<pMsgFunc>(&MainWindow::MsgFunc4)));
m_map.insert(std::make_pair(Msg_5,reinterpret_cast<pMsgFunc>(&MainWindow::MsgFunc5)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_btn_0_clicked() //产生消息的函数
{
Processer(Msg_0,"0 clicked");
}
void MainWindow::on_btn_1_clicked()
{
Processer(Msg_1,"1 clicked");
}
void MainWindow::on_btn_2_clicked()
{
Processer(Msg_2,"2 clicked");
}
void MainWindow::on_btn_3_clicked()
{
Processer(Msg_3,"3 clicked");
}
void MainWindow::on_btn_4_clicked()
{
Processer(Msg_4,"4 clicked");
}
void MainWindow::on_btn_5_clicked()
{
Processer(Msg_5,"5 clicked");
}
void MainWindow::Processer(Msg msg,QString str) //处理函数
{
//if(map.find(msg) != map.end())
// (this->*map[msg])(str);
//改成下面的更好
auto iter = map.find(msg);
if (iter != map.end())
{
(this->*(iter->second))(str);
}
}
void MainWindow::MsgFunc0(QString & str)
{
qDebug()<<__PRETTY_FUNCTION__<<str;
}
void MainWindow::MsgFunc1(QString & str)
{
qDebug()<<__PRETTY_FUNCTION__<<str;
}
void MainWindow::MsgFunc2(QString & str)
{
qDebug()<<__PRETTY_FUNCTION__<<str;
}
void MainWindow::MsgFunc3(QString & str)
{
qDebug()<<__PRETTY_FUNCTION__<<str;
}
void MainWindow::MsgFunc4(QString & str)
{
qDebug()<<__PRETTY_FUNCTION__<<str;
}
void MainWindow::MsgFunc5(QString & str)
{
qDebug()<<__PRETTY_FUNCTION__<<str;
}
构造函数中也可以写成:
#include "MainWindow.h"
#include "ui_MainWindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_map =
{
{Msg_0, &MainWindow::MsgFunc0},
{Msg_1, &MainWindow::MsgFunc1},
{Msg_2, &MainWindow::MsgFunc2},
{Msg_3, &MainWindow::MsgFunc3},
{Msg_4, &MainWindow::MsgFunc4},
{Msg_5, &MainWindow::MsgFunc5}
};
}