×

关于QT 实现全选复选框 和 列表的复选框的联动

zxjy辉 zxjy辉 发表于2024-08-09 11:42:56 浏览513 评论0

抢沙发发表评论

摄影自然风景素材-摄影自然风景模板-摄影自然风景图片免费下载-设图网

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


image.png

  1. 最终效果

    效果.gif

  2. 实现原理

    1. 首先就是要使用的是checkbox的toggled信号,不是clicked,也不是stateChanged,这两个信号,再checkbox的三态状态下都会触发槽函数,再实现的时候,不好处理(只要改变checkbox的状态,就会触发槽函数)

    2. 其次,就是要将checkbox的tristate属性设置为使能,这样才能使用三种状态(选中、半选中、非选中)

  3. 参考代码

    1. // 添加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);
                 }
          }
      }
    2. // 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);
      }
    3. // 刷新全选复选框的状态
      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);
          }
      }




#好好学习!

群贤毕至

访客