关于QTableWidget中监听QTableWidgetItem,实现相应对TableWidget中组件操作

笔者实现了一个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);
                    }
                }
            }
        }
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值