
目的:现有一个全选复选框,和多个列表内的复选框,要实现一个全选,子复选框(列表内的复选框)全部选中,反之,则全取消,同样,子复选框的选择也会反过来影响全选复选框

最终效果

实现原理
首先就是要使用的是checkbox的toggled信号,不是clicked,也不是stateChanged,这两个信号,再checkbox的三态状态下都会触发槽函数,再实现的时候,不好处理(只要改变checkbox的状态,就会触发槽函数)
其次,就是要将checkbox的tristate属性设置为使能,这样才能使用三种状态(选中、半选中、非选中)
参考代码
// 添加qtcmd控件按钮响应 void MainWindow::QtCmdWidgetAdd_Slots() { QtCmdWidgetAddToLayout(vlayout,&qtcmdWidgetList); // 根据qtcmd控件列表,设置全选复选框的状态 QtCmdFlushCheckBoxState(qtcmdWidgetList,ui->CB_CmdWidgetAllSelect); } // 删除qtcmd控件按钮响应 void MainWindow::QtCmdWidgetDelete_Slots() { QtCmdWidgetDeleteFromLayout(vlayout,&qtcmdWidgetList); // 删除控件 if(ui->CB_CmdWidgetAllSelect->checkState()==Qt::Checked){ // 如果全选按钮是选中的那么,在删除对应的控件之后,需要将全选状态去掉 ui->CB_CmdWidgetAllSelect->setChecked(false); } // 根据qtcmd控件列表,设置全选复选框的状态 QtCmdFlushCheckBoxState(qtcmdWidgetList,ui->CB_CmdWidgetAllSelect); } // 全选CheckBox的槽函数 // toggled信号,state只有半选中,和非选中的时候,才会触发对应的槽函数,在选中的时候不会触发 void MainWindow::QtCmdWidgetSelectStateChanged(bool state) { // // qDebug()<<state; if(state==true){ ui->CB_CmdWidgetAllSelect->setCheckState(Qt::Checked); foreach (const QVariant &var, qtcmdWidgetList) { QTCmdWidget *cmdWideget = qvariant_cast<QTCmdWidget*>(var); cmdWideget->SetCheckBoxState(Qt::Checked); } }else { foreach (const QVariant &var, qtcmdWidgetList) { QTCmdWidget *cmdWideget = qvariant_cast<QTCmdWidget*>(var); cmdWideget->SetCheckBoxState(state); } } }// qtcmd 复选框状态改变 void MainWindow::QtCmdWidgetCheckBoxChange_Slot(int state) { // qDebug()<<state; if(state==Qt::Unchecked){ // 当前的qtcmd如果是非选中的情况下 if(ui->CB_CmdWidgetAllSelect->checkState()==Qt::Checked){ // 且全选框已经打钩 ui->CB_CmdWidgetAllSelect->setCheckable(false); // 注意事项:就是设置半选的的时候,要将复选框失能,设置完毕再使能,否则打钩的全选无响应 ui->CB_CmdWidgetAllSelect->setCheckState(Qt::PartiallyChecked); // 那么全选的复选框,必然不是打钩的 ui->CB_CmdWidgetAllSelect->setCheckable(true); } } // 根据qtcmd控件列表,设置全选复选框的状态 QtCmdFlushCheckBoxState(qtcmdWidgetList,ui->CB_CmdWidgetAllSelect); }// 刷新全选复选框的状态 void MainWindow::QtCmdFlushCheckBoxState(QVariantList list, QCheckBox *box) { int checkedCount = 0; // 列表中选中的复选框的个数 // 遍历全部的qtcmd,如果是都是选中或是都不选中,则修改全选复选框的状态 foreach (const QVariant &var, list) { QTCmdWidget *cmdWideget = qvariant_cast<QTCmdWidget*>(var); if(cmdWideget->QtCmdRegister.CheckBoxState==2){ // 复选框选中 checkedCount++; } } if(checkedCount==0){ box->setCheckState(Qt::Unchecked); }else if(checkedCount==list.count()){ box->setCheckState(Qt::Checked); }else { box->setCheckable(false); // 注意事项:就是设置半选的的时候,要将复选框失能,设置完毕再使能,否则打钩的全选无响应 box->setCheckState(Qt::PartiallyChecked); // 那么全选的复选框,必然不是打钩的 box->setCheckable(true); } }
#好好学习!