前言

本文主要利用QSqlTableModel+QTableView来实现直接在QTableView中进行对数据库数据的操作
新增:点击新增按钮之后,光标直接移到最后一行,然后双击进行表内容的填充。
删除:选中一行之后,点击删除。
修改:选中一行,点击修改,此时表内容可修改。
提交:将进行的操作提交到数据库操作。
取消:取消操作。
在这里插入图片描述

QSqlTableModel

简易用法:

	// QSqlTableModel(QObject*, QSqlDatabase)
    m_sqlModel = new QSqlTableModel(this, m_access->m_sqlDatabase);
	
	// setTable -> tableName 就是你要查询的表名
    m_sqlModel->setTable("tableName");

	// 设置为手动刷新,用来达到需要手动提交的效果
    m_sqlModel->setEditStrategy(QSqlTableModel::OnManualSubmit);

新增

新增的主要逻辑是fetchMore到最后一行,然后再最后一行处添加一行空的数据,然后将表格设置为可编辑状态,然后再双击进行编辑

void ThresholdManage::on_btnNew_clicked()
{
	// 设置编辑模式
	// m_editMode是自定义变量,用于标识当前是否是编辑状态
    m_editMode = true;

	// 将其余功能按键禁用,将提交和取消启用
    ui->btnEdit->setDisabled(true);
    ui->btnNew->setDisabled(true);
    ui->btnDelete->setDisabled(true);
    ui->btnCancel->setEnabled(true);
    ui->btnSubmit->setEnabled(true);

    // m_sqlModel每次只能最大缓存256个,所以需要先fetchMore
    // 否则会导致移动到最后一行时,只会最多移到256行
    while (m_sqlModel->canFetchMore()) {
        m_sqlModel->fetchMore();
    }

    int rowCount = m_sqlModel->rowCount();

	// 在rowCount处添加一行
    m_sqlModel->insertRow(rowCount);

    m_sqlModel->setData(m_sqlModel->index(rowCount, 0), "");

	// 设置双击编辑
    ui->tableView->setEditTriggers(QTableView::DoubleClicked);

	// 滚动到底部
    ui->tableView->scrollToBottom();

}

在这里插入图片描述

删除

删除是直接removeRow,删除当前选中行,然后submitAll

void ThresholdManage::on_btnDelete_clicked()
{
	// 找到当前行,然后removeRow
    auto index = ui->tableView->currentIndex();
    m_sqlModel->removeRow(index.row());

	// 删除前,弹框确认
    int ok = QMessageBox::warning(this, "删除当前行!", "确定删除当前行?", QMessageBox::Yes, QMessageBox::No);

    if (ok == QMessageBox::No) {
        m_sqlModel->revertAll();
        return;
    }

	// 提交
    m_sqlModel->submitAll();
    // 查询
    m_sqlModel->select();
}

在这里插入图片描述

修改

修改是将表格的编辑模式打开

void ThresholdManage::on_btnEdit_clicked()
{
    // TODO
    // 将其余按键状态置灰

    m_editMode = true;
    
    // 将表格的编辑模式打开
    ui->tableView->setEditTriggers(QAbstractItemView::DoubleClicked);

    ui->btnNew->setDisabled(true);
    ui->btnNew->setDisabled(true);
    ui->btnDelete->setDisabled(true);
    ui->btnCancel->setEnabled(true);
    ui->btnSubmit->setEnabled(true);

}

在这里插入图片描述

提交

提交是submitAll

void ThresholdManage::on_btnSubmit_clicked()
{
    // TODO
    // 刷新表格的内容
    m_editMode = false;

	// 提交弹框确认
    int ok = QMessageBox::warning(this, "提交修改", "确定提交修改?", QMessageBox::Yes, QMessageBox::No);

    if (ok == QMessageBox::No) {
        qDebug() << "取消提交";
        return;
    }

	// 提交修改
    m_sqlModel->submitAll();

    ui->btnNew->setEnabled(true);
    ui->btnEdit->setEnabled(true);
    ui->btnDelete->setEnabled(true);
    ui->btnCancel->setDisabled(true);
    ui->btnSubmit->setDisabled(true);

	// 将表格置为不可修改
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
}

在这里插入图片描述

取消

取消是revertAll

void ThresholdManage::on_btnCancel_clicked()
{
    // TODO
    // 刷新表格的内容
    m_editMode = false;

	// 取消所有
    m_sqlModel->revertAll();

    ui->btnNew->setEnabled(true);
    ui->btnEdit->setEnabled(true);
    ui->btnDelete->setEnabled(true);
    ui->btnCancel->setDisabled(true);
    ui->btnSubmit->setDisabled(true);

    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
}

代码如下:资源

刚刚发现这个资源我上传的时候我设置的不需要积分,但是后台自动给我加了积分…可以访问这个下载

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐