#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDebug>
QMap<QPair<int, int>, QString> originalValuesMap;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// ui->checkBox->setTristate(true);
// ui->checkBox_2->setTristate(true);
// ui->checkBox_3->setTristate(true);
//Qt 4
// connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(currentIndexChanged(int)));
// connect(ui->comboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(currentIndexChanged(QString)));
//Qt 5
connect(ui->comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [=](int index){
QMessageBox::information(this, "index", QString::number(index));
});
connect(ui->comboBox, &QComboBox::currentTextChanged, this, [=](const QString &text){
QMessageBox::information(this, "text", text);
});
//绑定双击单元格修改事件
// connect(ui->tableWidget,&QTableWidget::itemChanged,[=](QTableWidgetItem *item){
// if(!item)
// return;
// int row = item->row();
// int col = item->column();
// qDebug()<<row<<col;
// QString originalValue = originalValuesMap[qMakePair(row, col)];
// QString newValue = item->text();
// qDebug()<<originalValue<<newValue;
// if(originalValue!=newValue)
// {
// // 根据行和列更新数据库中的值
// // 请根据你的数据库连接和表结构进行实际实现
// // 示例:假设表名为 YourTable,列名为 Column1 和 Column2
//// QSqlQuery query;
//// query.prepare("UPDATE YourTable SET Column" + QString::number(col + 1) + " = :value WHERE ID = :id");
//// query.bindValue(":value", newValue);
//// query.bindValue(":id", row + 1); // Assuming ID is a unique identifier for each row
//// query.exec();
// }
// });
// // 绑定双击事件到槽函数
// connect(ui->tableWidget,&QTableWidget::doubleClicked,[=]{
// //没有选中行
// if(ui->tableWidget->currentRow()<0)
// return;
// //选中行第1列 id
// int nID = ui->tableWidget->item(ui->tableWidget->currentRow(),0)->text().toInt();
// //选中行第2列 name
// QString strName = ui->tableWidget->item(ui->tableWidget->currentRow(),1)->text();
// //选中行第3列 pwd
// QString strPwd = ui->tableWidget->item(ui->tableWidget->currentRow(),2)->text();
// qDebug()<<nID<<strName<<strPwd;
// });
//初始化表格样式
//横表头颜色
ui->tableWidget->setStyleSheet("QHeaderView::section:horizontal{border-bottom:1px solid rgb(255, 255, 255);background-color: rgb(60, 120, 180);color: rgb(255, 255, 255);}");
//调整每一列的宽度,使其适应该列中最宽的内容。确保表格内容以最佳方式显示。
ui->tableWidget->resizeColumnsToContents();
//隐藏行表头=false
ui->tableWidget->verticalHeader()->setVisible(true);
//隐藏列表头=false
ui->tableWidget->horizontalHeader()->setVisible(true);
//无法通过点击表头来进行排序
ui->tableWidget->horizontalHeader()->setSectionsClickable(false);
//列宽设置
ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
//QHeaderView::Stretch:根据窗口大小将每列等比填满,并随窗口变化变化
//QHeaderView::ResizeToContents:根据内容自适应
//不能通过双击单元格或其他方式直接编辑表格中的内容
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
//选中方式 为 整行选中
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableWidget->setRowCount(6); //行数 6行
ui->tableWidget->setColumnCount(4); //列数 3列
ui->tableWidget->setHorizontalHeaderLabels({"选择","列表头ID","列表头Name","列表头Pwd"});
//隐藏第一列 第一列一般都是用于删除和修改用的id
// ui->tableWidget->setColumnHidden(0,true);
//列表头高度
// ui->tableWidget->horizontalHeader()->setMinimumHeight(50);
//设置第一列宽度=100 注意与上边的 列宽设置 有冲突,列宽设置会覆盖此项设置
// ui->tableWidget->setColumnWidth(0,200);
//设置第一行高度
// ui->tableWidget->setRowHeight(0,50);
//初始化表格数据
for (int i = 0; i < 6; ++i) {
//给第一列 动态创建checkbox
QCheckBox *cb = new QCheckBox();
ui->tableWidget->setCellWidget(i,0,cb);
//给第一列ID赋值
ui->tableWidget->setItem(i, 1, new QTableWidgetItem(QString("%1").arg(i)));
//给第二列Name赋值
ui->tableWidget->setItem(i, 2, new QTableWidgetItem("name"+QString::number(i)));
//给第三列Pwd赋值
ui->tableWidget->setItem(i, 3, new QTableWidgetItem("123"+QString::number(i)));
}
//表格单击修改 checkbox 状态
connect(ui->tableWidget,&QTableWidget::clicked,[=]{
QCheckBox *cb = static_cast<QCheckBox*>(ui->tableWidget->cellWidget(ui->tableWidget->currentRow(),0));
cb->setChecked(!cb->isChecked());
});
// for (int row = 0; row < ui->tableWidget->rowCount(); ++row) {
// for (int col = 0; col < ui->tableWidget->columnCount()-1; ++col) {
// // Store the original value in the map
// originalValuesMap[qMakePair(row, col)] = ui->tableWidget->item(row,col)->text();
// }
// }
}
void MainWindow::on_pushButton_clicked()
{
//循环表格,获取checkbox选中的行数据
for (int i=0;i<ui->tableWidget->rowCount();++i) {
//选中行第0列 checkbox状态
QCheckBox *cb = static_cast<QCheckBox*>(ui->tableWidget->cellWidget(i,0));
qDebug()<<cb->isChecked();
if(cb->isChecked())
{
//选中行第1列 id
int nID = ui->tableWidget->item(i,1)->text().toInt();
//选中行第2列 name
QString strName = ui->tableWidget->item(i,2)->text();
//选中行第3列 pwd
QString strPwd = ui->tableWidget->item(i,3)->text();
qDebug()<<nID<<strName<<strPwd;
}
}
}
void MainWindow::currentIndexChanged(int index)
{
QMessageBox::information(this,"index",QString::number(index));
}
void MainWindow::currentIndexChanged(QString text)
{
QMessageBox::information(this,"text",text);
}
MainWindow::~MainWindow()
{
delete ui;
}
QTableWidget第一列,动态创建QCheckbox,单击行,可以修改Checkbox的状态 单击按钮获取选中行的数据
需积分: 0 139 浏览量
更新于2024-01-30
2
收藏 16KB ZIP 举报
在Qt编程中,`QTableWidget` 是一个非常常用的组件,用于展示表格数据。它提供了丰富的功能,包括编辑、排序和选择行等。本示例着重讲解如何在`QTableWidget`的第一列动态创建`QCheckbox`,以及如何在用户单击行时更新Checkbox的状态,并在单击按钮后获取选中行的数据。以下将详细阐述实现这个功能所需的知识点。
我们需要了解`QTableWidget`的基本用法。`QTableWidget`是`QTableView`和`QAbstractItemView`的子类,它可以自动管理表格的行、列和单元格。在创建`QTableWidget`时,我们需要指定行数和列数,然后可以通过`setItem`或`setCellWidget`方法添加内容到指定的单元格。
在本例中,动态创建`QCheckbox`是在`QTableWidget`的第一列进行的。这通常需要重写`QTableWidgetItem`的`paintEvent`函数,或者在`QTableWidget`的`cellClicked`信号触发时添加`QCheckbox`。我们可以使用`QTableWidgetItem`的`setFlags`方法来禁用默认的点击事件,防止点击单元格时触发文本编辑,然后在该单元格内放置`QCheckbox`。
`QCheckbox`的状态改变可以通过连接`stateChanged`信号来处理。当用户单击`QCheckbox`时,`stateChanged`信号会被发射,我们可以在这个信号中更新相应的数据模型。例如,可以将每一行与一个数据结构(如`std::map<int, bool>`)对应,存储每行Checkbox的状态。
接下来,为了实现单击行时修改Checkbox的状态,我们需要连接`QTableWidget`的`currentChanged`信号。当用户点击表格中的行时,此信号会发射,传递当前选中的行索引。在槽函数中,我们可以根据新选中的行索引获取对应的`QTableWidgetItem`,并检查是否为第一列。如果是,则可以获取`QCheckbox`并改变其状态。
为了在单击按钮后获取选中行的数据,我们需要一个`QPushButton`并连接它的`clicked`信号。在槽函数中,通过`QTableWidget`的`selectedItems()`方法可以获取所有选中行的`QTableWidgetItem`对象。遍历这些对象,可以提取出`QCheckbox`所在的行和它们的状态,从而获取用户选择的数据。
实现这一功能的完整代码可能如下:
```cpp
// 假设ui已经设置好QTableWidget和QPushButton
void MainWindow::initTable() {
// 初始化表
tableWidget->setRowCount(10);
tableWidget->setColumnCount(3);
// 添加Checkbox到第一列
for (int row = 0; row < tableWidget->rowCount(); ++row) {
QTableWidgetItem *item = new QTableWidgetItem();
item->setFlags(item->flags() & ~Qt::ItemIsEditable);
QTableWidgetItem *checkboxItem = new QTableWidgetItem();
checkboxItem->setFlags(checkboxItem->flags() | Qt::ItemIsUserCheckable);
checkboxItem->setCheckState(Qt::Unchecked);
tableWidget->setCellWidget(row, 0, checkboxItem);
}
// 连接信号
connect(tableWidget, &QTableWidget::currentChanged, this, &MainWindow::onRowSelected);
connect(button, &QPushButton::clicked, this, &MainWindow::onGetData);
}
void MainWindow::onRowSelected(int currentRow) {
QTableWidgetItem *checkboxItem = tableWidget->item(currentRow, 0);
if (checkboxItem) {
QCheckBox *checkBox = qobject_cast<QCheckBox*>(tableWidget->cellWidget(currentRow, 0));
if (checkBox) {
checkBox->setChecked(!checkBox->isChecked());
}
}
}
void MainWindow::onGetData() {
QList<QTableWidgetItem*> selectedItems = tableWidget->selectedItems();
for (QTableWidgetItem *item : selectedItems) {
int row = item->row();
QTableWidgetItem *checkboxItem = tableWidget->item(row, 0);
if (checkboxItem && checkboxItem->checkState() == Qt::Checked) {
// 处理选中行的数据
}
}
}
```
以上就是关于`QTableWidget`动态创建`QCheckbox`,单击行修改状态,以及获取选中行数据的知识点详解。理解并应用这些知识,可以帮助开发者在Qt界面中构建更加交互式的表格应用。

周不易
- 粉丝: 533
- 资源: 20
最新资源
- kolesar_3cd_01_0117.pdf
- ho_01_0709.pdf
- holden_3ck_01_0518.pdf
- INCITS T11 Liaison Report to 802 3.pdf
- ingham_3cd_01_0716.pdf
- ingham_3cd_01_0516.pdf
- ishida_01_0507.pdf
- ingham_3cd_01_0916.pdf
- ingham_3cd_02_0716.pdf
- ishida_01_0907.pdf
- isono_01_0108.pdf
- isono 01 0109.pdf
- isono_01_0508.pdf
- isono_01_0708.pdf
- isono_01_0308.pdf
- isono_01_1107.pdf