写点什么

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

  • 2022 年 9 月 17 日
    河北
  • 本文字数:922 字

    阅读完需:约 3 分钟

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


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

Qt 方式

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


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


举例说明:


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


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


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


消息转换,如下:


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


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

MFC 方式

开发环境:win10 VS2010 win32


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


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


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


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


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


参数 1:代表起始 ID 号


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


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


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


代码如下:


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


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


我是中国好公民 st,一名 C++程序 yua~

发布于: 刚刚阅读数: 4
用户头像

书山有路勤为径,学海无涯苦作舟 2022.07.01 加入

擅长语言:C++ 涉及语言:Python

评论

发布
暂无评论
MFC与Qt多个控件响应统一响应消息处理_c++_中国好公民st_InfoQ写作社区