点全选复选框,下面所有的复选框都会跟着选中,取消选中也一样。
具体实现:
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
槽函数。)
- 创建一个水平方向的
QHeaderView
对象,并将其分配给headerView
指针。 - 将
headerView
设置为表格部件 (ui.tableWidget
) 的水平表头,这样表格部件就会使用这个自定义的表头。 - 创建一个复选框对象
checkBox
,并设置其文本为 "全选"。 - 使用
setIndexWidget()
方法将复选框插入到表头的第一行第一列中,这意味着复选框将显示在表头的左上角位置。 - 将复选框的点击信号 (
clicked
) 与selectAllRows
槽函数连接起来,这样当复选框被点击时,槽函数selectAllRows
就会被调用。
//复选框(通过这段代码,你可以在表格中的每一行中添加一个复选框,并实现根据用户点击复选框来动态选择或取消选择行的功能)
- 使用一个循环在表格中的每一行中创建一个复选框,并设置其初始状态为未勾选。
- 使用
stateChanged
信号连接一个 lambda 表达式,该 lambda 表达式会在复选框的状态发生变化时被调用。 - 在 lambda 表达式中,根据复选框的状态 (
Qt::Checked
或Qt::Unchecked
) 将对应的行索引添加到selectedRows
列表中或从中移除。 - 创建一个
QWidget
和一个QHBoxLayout
,将复选框添加到布局中,并将布局设置为小部件的布局。 - 将包含复选框的小部件添加到表格的指定行和第一列中。
//void SqlWindow::selectAllRows(bool checked)(通过这个函数,你可以实现全选功能,当用户点击全选复选框时,表格中的所有行都会被选择或取消选择。)
- 清空
selectedRows
列表,以确保在选择新行之前清除旧的选择。 - 使用循环遍历表格中的每一行。
- 对于每一行,首先通过
cellWidget()
方法获取该行的第一列中的小部件。 - 如果找到了小部件,则通过
findChild<QCheckBox*>()
方法找到该小部件中的复选框。 - 如果找到了复选框,则将其状态设置为
checked
参数指定的状态,并在需要时将该行的索引添加到selectedRows
列表中。