Qt|多个按钮控件响应同一个消息处理--晋级版

209 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情

今天学了一项新功能,分享给大家~

之前我更新过这样一篇文章:MFC与Qt多个控件响应统一响应消息处理,今天对Qt中多个按钮控件响应同一消息处理的另一个方法!

QButtonGroup这个类的使用与MFC中多控件消息处理类似。

首先,看一下实现出来的效果吧~

按钮组.gif

下面,就对上述展示效果进行功能讲解~

1:创建QButtonGroup

.h声明

QButtonGroup *m_btnGroup;

.cpp使用

m_btnGroup = new QButtonGroup(this);

直接将该指针绑定到页面上。

2:创建QPushButton子项

当前例子中创建了4个子控件按钮,这里只是展示一个的创建方式:

QString qsTitle = QStringLiteral("按钮") + QString::number(i+1);
QPushButton *btn = new QPushButton(this);
btn->setGeometry(nLeft, 40, 70, 40);
btn->setText(qsTitle);
btn->show();
nLeft = btn->geometry().right() + 20;
m_vetBtnCtrls.push_back(btn);
m_btnGroup->addButton(btn, i+1);

代码解析:

其实这段代码我是放到了一个for循环中,遍历方式创建。

m_vetBtnCtrls:是存储所有创建的QPushButton控件指针,当页面销毁时,也需要销毁该指针,防止内存泄漏,定义:std::vector<QPushButton*> m_vetBtnCtrls;

最后一句代码是最重要的,将QPushButton指针添加到QButtonGroup,用于管理,并对每个指针添加一个编号绑定,这类似于QPushButton::setProperty()函数,同样是对该指针进行编号绑定。

不过,setProperty会更灵活一些,可以绑定字符串类型、整型、浮点型等等。

3:QButtonGroup消息绑定

按照之前的方法,会对每个按钮控件做QPushButton::clicked消息处理,使用了按钮组之后,直接使用QButtonGroup的消息就可以了。

查看QButtonGroup.h文件中发现,buttonClicked消息可以实现消息处理

void buttonClicked(QAbstractButton *);
void buttonClicked(int);

在类中会发现buttonClicked是个重载函数,那么,在使用connect消息时如何确定用的是哪个消息呢?

例如下面的方法:

connect(m_btnGroup, &QButtonGroup::buttonClicked, this, &QPushButtonGroupTest::OnBtnGroupClicked);

直接使用会发现,直接报错:上下文不允许消除重载函数的歧义

对于使用类似于这种重载消息时,需要重新对该消息进行定义,如下面的方式:

void (QButtonGroup::*OnButtonClicked)(int) = &QButtonGroup::buttonClicked;
connect(m_btnGroup, OnButtonClicked, this, &QPushButtonGroupTest::OnBtnGroupClicked);

最后,销毁页面时一定要将new出来的进行销毁,否则会导致内存泄漏。

今天的更新就到这里了~

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