笔者实现了一个QTableWidget显示数据库数据的代码:
//先在UI中设置一个tableWidget,设置总列数为3
ui->tableWidget_push->setColumnCount(3);
//设置表头标题
QStringList headers = {"推送", "更新版本号", "发布时间"};
ui->tableWidget_push->setHorizontalHeaderLabels(headers);
//调用函数fillTableWidget()填充表格,传入tableWidget_push的指针
fillTableWidget(ui->tableWidget_push);
//下面给出fillTableWidget的实现
void Manager::fillTableWidget(QTableWidget *tableWidget, const QString &versionNumberFilter)
{
//查出需要展示的数据,请填入你的数据,本数据仅作示例
QSqlQuery query;
QString sql = "USE QianmoPackages;SELECT project, version_number, publish_time,is_push";
//作显示筛选条件
if (!versionNumberFilter.isEmpty()) {
sql += " AND project LIKE '%" + versionNumberFilter + "%'";
}
query.prepare(sql);
if (!query.exec()) {
qDebug() << "查询失败:" << query.lastError().text();
return;
}
tableWidget->setRowCount(0);
while (query.next()) {
int row = tableWidget->rowCount();
tableWidget->insertRow(row);
//将is_push作为复选框数据
QTableWidgetItem *checkBoxItem = new QTableWidgetItem();
bool isChecked = query.value(3).toBool();
checkBoxItem->setCheckState(isChecked ? Qt::Checked : Qt::Unchecked);
checkBoxItem->setText(query.value(0).toString());
checkBoxItem->setTextAlignment(Qt::AlignCenter);
// 设置文本不可编辑
checkBoxItem->setFlags(checkBoxItem->flags() & ~Qt::ItemIsEditable);
tableWidget->setItem(row, 0, checkBoxItem);
//版本信息这一列
QTableWidgetItem *versionItem = new QTableWidgetItem(query.value(1).toString());
versionItem->setTextAlignment(Qt::AlignCenter);
versionItem->setFlags(versionItem->flags() & ~Qt::ItemIsEditable); // 设置为不可编辑
tableWidget->setItem(row, 1, versionItem);
// 处理“发布时间”这一列
QString dateTimeString = query.value(2).toString();
QDateTime dateTime = QDateTime::fromString(dateTimeString, "yyyy-MM-ddTHH:mm:ss");
QTableWidgetItem *dateTimeItem;
if (dateTime.isValid()) {
QString formattedDate = dateTime.toString("yyyy-MM-dd HH:mm:ss"); // 指定常用日期格式
dateTimeItem = new QTableWidgetItem(formattedDate);
} else {
// 如果日期时间无效,则显示空白或错误消息
dateTimeItem = new QTableWidgetItem("无效日期");
}
dateTimeItem->setTextAlignment(Qt::AlignCenter);
dateTimeItem->setFlags(dateTimeItem->flags() & ~Qt::ItemIsEditable); // 设置为不可编辑
tableWidget->setItem(row, 2, dateTimeItem);
}
}
实现出来的效果大概是一个TableWidget窗口显示着数据库查出来的数据,特殊的地方在于第一列,第一列是一列复选框,表示当前数据库is_push的状态。因为保密需求,不展示图片,敬请谅解。
现在想实现监听复选框的信号,实现一个如下的功能:
比如在当前表格中有{1.01,1.0.2,1.0.3,1.0.4} 这几行数据的版本号,可以实现勾选一个版本号后,将此版本号前的版本号自动勾选。比如勾选 1.0.3,那么自动将 1.0.1 1.0.2勾选。这样做的原因是便于进行版本管理,防止误操作给数据库带来的未知错误。
下面展示处理方法:
先连接信号与信号槽,信号是TableWidget中的itemChanged信号
connect(ui->tableWidget_push, &QTableWidget::itemChanged, this, &Manager::onTableWidgetItemChanged);
槽函数实现如下:
void Manager::onTableWidgetItemChanged(QTableWidgetItem *item)
{
//检测指针是否为空,为空则返回,否则会导致程序崩溃
if (!item || item->column() != 0) {
return; // 如果不是第一列或item为空,则直接返回
}
bool isChecked = item->checkState() == Qt::Checked;
//获取当前的行数
int row = item->row();
// 检查tableWidget_push是否为空
if (!ui->tableWidget_push) {
qDebug() << "Error: tableWidget_push is null!";
return;
}
QString strProjectName;
QString strVersion;
// 获取项目名和版本号
QTableWidgetItem *projectNameItem = ui->tableWidget_push->item(row, 0);
QTableWidgetItem *versionItem = ui->tableWidget_push->item(row, 1);
//检测指针是否为空
if (!projectNameItem || !versionItem) {
qDebug() << "Error: Project name or version item is null for row" << row;
return;
}
strProjectName = projectNameItem->text();
strVersion = versionItem->text();
// 获取版本号序列
QStringList versionNumbers = VersionInfo::getVersionNumbersByProjectFromBegin(strProjectName, strVersion);
//核心代码
// 遍历表格,更新其他行的选中状态
for (int i = 0; i < ui->tableWidget_push->rowCount(); ++i) {
if (i != row) { // 跳过当前行
QTableWidgetItem *otherProjectNameItem = ui->tableWidget_push->item(i, 0);
QTableWidgetItem *otherVersionItem = ui->tableWidget_push->item(i, 1);
if (otherProjectNameItem && otherVersionItem) {
//将当前行的数据和条件进行对比,满足条件则更新状态
if (otherProjectNameItem->text() == strProjectName && versionNumbers.contains(otherVersionItem->text()) ) {
// 如果项目名和版本号匹配,则更新选中状态
QTableWidgetItem *otherCheckBoxItem = ui->tableWidget_push->item(i, 0);
if (otherCheckBoxItem) {
otherCheckBoxItem->setCheckState(isChecked ? Qt::Checked : Qt::Unchecked);
}
}
}
}
}
}