MFC与Qt多个控件响应统一响应消息处理

就目前使用C++开发框架来说,今天来讲述下MFC框架下与Qt框架下,如何让多个控件响应统一消息处理方法。

功能:假设有5个按钮,需要响应同一个处理函数,该如何实现呢?

Qt方式

开发环境:win10 VS2017 + Qt5.14.2 x64位

在Qt框架下,想要多个按钮实现一个消息非常简单,只需要在响应槽函数的时候,同时响应到一个函数中就可以了,Qt的信号与槽机制支持这种同一槽与多个信号连接的功能。

举例说明:

cpp 复制代码
connect(ui.btn1, &QPushButton::clicked, this, &QMyWidget::OnBnClicked);
connect(ui.btn2, &QPushButton::clicked, this, &QMyWidget::OnBnClicked);

在这里,唯一有点难度的就是,多个按钮控件响应同一个响应函数时,如何判断是哪个控件触发的呢?

使用qobject_cast方法,类似于标准C++中的dynamic_cast。在这里还需要注意一点的是,如果当前操作的类没有被Q_OBJECT宏声明,这个函数的返回值是未定义的。

消息转换,如下:

cpp 复制代码
QPushButton *btnCurrent = qobject_cast<QPushButton*>(sender());

代码中,btnCurrent是当前处于点击的按钮指针。由此可以获取筛选并做出不同的处理。

MFC方式

开发环境:win10 VS2010 win32

对于MFC框架下实现来说,会稍微有点麻烦。在多个按钮控件响应同一消息时,需要确定响应ID区域。当我们无法确定有多少个按钮需要响应同一函数时,就会造成ID编号空闲,造成不必要的浪费。

接下来,先说一说,已知的固定ID号对应响应同一个响应函数吧。

这里,需要注意的是,控件的ID一定是连续的

cpp 复制代码
ON_COMMAND_RANGE(ID_BUTTON_1 , ID_BUTTON_5 , OnBnClickedMultiple);

当前宏:ON_COMMAND_RANGE 可以将一个连续范围的命令ID映射到单个命令处理函数中。只有一个消息映射条目可以匹配给定的命令ID,也就是说,不能将一个命令映射到多个处理程序。

参数1:代表起始ID号

参数2:代表终止ID号,需要响应的ID编号在这两个编号之间,属于闭区间。

参数3:多个控件响应的同一个处理函数。

与QT方式不一样的地方在于,响应函数中是存在参数的,并且该参数是当前处于响应的控件ID。

代码如下:

cpp 复制代码
afx_msg  void OnBnClickedMultiple(UINT nID);

Qt与MFC方式的多个消息统一响应一个函数的处理到这里就讲述完成了,功能比较简单,相比较而言,还是使用Qt框架更为简单~

我是糯诺诺米团,一名C++开发程序媛~

相关推荐
stolentime6 分钟前
P14978 [USACO26JAN1] Mooclear Reactor S题解
数据结构·c++·算法·扫描线·usaco
CSDN_RTKLIB14 分钟前
C++多元谓词
c++·算法·stl
Cinema KI1 小时前
一键定位,哈希桶的极速魔法
数据结构·c++·算法·哈希算法
D_evil__1 小时前
【Effective Modern C++】第三章 转向现代C++:8. 优先选用nullptr,而非0或NULL
c++
楼田莉子1 小时前
Linux系统小项目——“主从设计模式”进程池
linux·服务器·开发语言·c++·vscode·学习
从此不归路1 小时前
Qt5 进阶【7】网络请求与 REST API 实战:QNetworkAccessManager 深度应用
开发语言·c++·qt
试剂小课堂 Pro1 小时前
mPEG-Silane:mPEG链单端接三乙氧基硅的亲水性硅烷偶联剂
java·c语言·网络·c++·python·tomcat
mjhcsp1 小时前
P14992 取模(题解)
c++
Henry Zhu1232 小时前
Qt Model/View架构详解(三):自定义模型
开发语言·qt
老歌老听老掉牙2 小时前
16宫格属性分析系统:打造专业级科学数据可视化工具
c++·qt·可视化