c++消息映射到处理函数(类似表驱动或者消息映射)

33 篇文章 0 订阅

转自: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}
	};
}

在这里插入图片描述

原文:
https://blog.csdn.net/yangyang031213/article/details/80716226?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

Qt 利用QSignalMapper区分按钮点击

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值