QT-复选框checkbox全选设置

7 篇文章 0 订阅
本文详细描述了如何在表格中实现全选复选框,通过QHeaderView和QCheckBox在表头和单元格中操作,以及selectAllRows槽函数来处理全选和单行选择的逻辑。
摘要由CSDN通过智能技术生成

 点全选复选框,下面所有的复选框都会跟着选中,取消选中也一样。

具体实现:

        1、在表头第一列添加全选框(checkbox)以及“全选”文字(需要自定义表头)

        2、表格内第一列添加复选框         

//全选框  
    QHeaderView* headerView = new QHeaderView(Qt::Horizontal);
    ui.tableWidget->setHorizontalHeader(headerView);
    QCheckBox* checkBox = new QCheckBox(QStringLiteral("全选"));
    headerView->setIndexWidget(headerView->model()->index(0, 0), checkBox);
    connect(checkBox, &QCheckBox::clicked, this, &SqlWindow::selectAllRows);



//复选框
    for (int row = 0; row < 1000; row++)//即1-1000行
    {
        QCheckBox* checkBox = new QCheckBox(); 
        checkBox->setCheckState(Qt::Unchecked);//默认未勾选

        connect(checkBox, &QCheckBox::stateChanged, [=](int state)//监听勾选框状态变化的信号
            {
                if (state == Qt::Checked) {
                    //ui.tableWidget->selectRow(row);// 勾选框被选中,选中整行,state表示勾选框的状态
                    //ui.tableWidget->selectRow(row);
                    selectedRows.append(row);
                }
                else {
                    //ui.tableWidget->clearSelection();// 勾选框未选中
                    selectedRows.removeOne(row);
                }
            } 
        );
        QWidget* widget = new QWidget;
        QHBoxLayout* layout = new QHBoxLayout;
        layout->addWidget(checkBox);
        widget->setLayout(layout);
        layout->setAlignment(Qt::AlignCenter);
        ui.tableWidget->setCellWidget(row, 0, widget);// 将小部件勾选框添加到表格中
    }



// 全选行槽函数
void SqlWindow::selectAllRows(bool checked){
    selectedRows.clear(); // 先清空已选中的行

    for (int row = 0; row < ui.tableWidget->rowCount(); ++row) {
        QWidget* widget = ui.tableWidget->cellWidget(row, 0);
        if (widget) {
            QCheckBox* rowCheckBox = widget->findChild<QCheckBox*>();
            if (rowCheckBox) {
                rowCheckBox->setChecked(checked);
                if (checked) {
                    selectedRows.append(row);
                }
            }
        }
    }
}

代码解释:

//全选框(selectAllRows 槽函数中,你可以实现选择表格中所有行的逻辑。这段代码的效果是,在表格的左上角添加了一个 "全选" 的复选框,用户点击它时,会触发 selectAllRows 槽函数。

  1. 创建一个水平方向的 QHeaderView 对象,并将其分配给 headerView 指针。
  2. 将 headerView 设置为表格部件 (ui.tableWidget) 的水平表头,这样表格部件就会使用这个自定义的表头。
  3. 创建一个复选框对象 checkBox,并设置其文本为 "全选"。
  4. 使用 setIndexWidget() 方法将复选框插入到表头的第一行第一列中,这意味着复选框将显示在表头的左上角位置。
  5. 将复选框的点击信号 (clicked) 与 selectAllRows 槽函数连接起来,这样当复选框被点击时,槽函数 selectAllRows 就会被调用。

//复选框(通过这段代码,你可以在表格中的每一行中添加一个复选框,并实现根据用户点击复选框来动态选择或取消选择行的功能

  1. 使用一个循环在表格中的每一行中创建一个复选框,并设置其初始状态为未勾选。
  2. 使用 stateChanged 信号连接一个 lambda 表达式,该 lambda 表达式会在复选框的状态发生变化时被调用。
  3. 在 lambda 表达式中,根据复选框的状态 (Qt::Checked 或 Qt::Unchecked) 将对应的行索引添加到 selectedRows 列表中或从中移除。
  4. 创建一个 QWidget 和一个 QHBoxLayout,将复选框添加到布局中,并将布局设置为小部件的布局。
  5. 将包含复选框的小部件添加到表格的指定行和第一列中。

//void SqlWindow::selectAllRows(bool checked)(通过这个函数,你可以实现全选功能,当用户点击全选复选框时,表格中的所有行都会被选择或取消选择。)

  1. 清空 selectedRows 列表,以确保在选择新行之前清除旧的选择。
  2. 使用循环遍历表格中的每一行。
  3. 对于每一行,首先通过 cellWidget() 方法获取该行的第一列中的小部件。
  4. 如果找到了小部件,则通过 findChild<QCheckBox*>() 方法找到该小部件中的复选框。
  5. 如果找到了复选框,则将其状态设置为 checked 参数指定的状态,并在需要时将该行的索引添加到 selectedRows 列表中。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值