多个Qcheckbox信号映射进一个槽函数并且规定Qcheckbox选择个数

工作开发任务比较紧迫,继今年毕业找工作到如今已经转正拿到offer了。连续几个月没有更新博客了,确实不应该,以后还是每月争取多多更新积累点知识以作记录。

今天继续QT移动端的开发,有个需求要求界面Qcheckbox限定勾选个数,下面对问题进行分解:

(1)限定个数,增加计数器即可;

(2)如果大于限定选择个数,如何解决?

(3)多勾选的box肯定是要先向用户提示限定勾选的个数然后取消勾选掉最后一个,如何实现?

(4)信号槽如何实现最为理想,让用户体验更佳?

解决方法一:

布局增加确定按钮, 在你的布局中进行遍历,判断多少个Qcheckbox被选中,如果大于5则用QMessagebox不能进行到下一步。这是一个比较蹩脚的方案,因为你并没有实现自动取消勾选多余Qcheckbox,并没有解决掉先前问题的分解,后者这样并没有达到需求,你增加了一个按钮,这样其实会破坏整体的布局,减少用户的体验。

解决方案二:

暂时想到的比较好的解决方案,使页面上的几个Qcheckbox连接到同一个槽函数内,在这个槽函数里面进行计数判断,问题解决了三个,还有一个如何拿到信号发射者?查阅资料后我发现有这两个方法:

(1)sender对象,找到发出者的对象然后进行强制转换对对象指针;

(2)使用QSingalMapper类;

这里选择方案一进行解决,贴出代码如下所示:

	connect(ui->cb1, SIGNAL(clicked()), this, SLOT(getcheckbox()));
	connect(ui->cb2, SIGNAL(clicked()), this, SLOT(getcheckbox()));
	connect(ui->cb3, SIGNAL(clicked()), this, SLOT(getcheckbox()));
	connect(ui->cb4, SIGNAL(clicked()), this, SLOT(getcheckbox()));
	connect(ui->cb5, SIGNAL(clicked()), this, SLOT(getcheckbox()));
	connect(ui->cb6, SIGNAL(clicked()), this, SLOT(getcheckbox()));
	connect(ui->cb7, SIGNAL(clicked()), this, SLOT(getcheckbox()));
	connect(ui->cb8, SIGNAL(clicked()), this, SLOT(getcheckbox()));
	connect(ui->cb9, SIGNAL(clicked()), this, SLOT(getcheckbox()));
void frmTest::getcheckbox()
{
	QObject *obj = QObject::sender();
	QCheckBox *chb = qobject_cast<QCheckBox *>(obj);
	/*QString name = chb->objectName();*/
	if (chb->isChecked()){
		sum++;
	} else {
		sum--;
	}
	if (6 == sum)
	{
		chb->toggle();
		sum--;
		QMessageBox::warning(NULL, tr("warning"), tr("you must choose 5 or less"), QMessageBox::Yes | QMessageBox::No);
	}
}

完美解决今天小需求!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值