工作开发任务比较紧迫,继今年毕业找工作到如今已经转正拿到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);
}
}
完美解决今天小需求!