QTablemodel与SQL关联

一、前言

本文对数据库和table view进行了关联,主要记录QSqlTableModel的使用方法。

二、基本原理和ui界面

QSqlTableModel提供了一个一次只能操作单个SQL表的读写模型,它是QSqlQuery的更高层次的替代品,可以浏览和修改独立的SQL表,并且不需要了解SQL语法。里面提供了多种方法方便进行对数据表的操作。

ui界面如下:由一个tableView和数个button组成

三、详细原理

连接数据库,我用的是MySql的数据库,如果MySql连接遇到问题可以参考我的上一篇文章

设置数据库名,端口,用户和密码,并进行打开

db = QSqlDatabase::addDatabase("QMYSQL");
    db.setDatabaseName(dbName);
    db.setHostName("localhost");
    db.setPort(3306);
    db.setUserName("root");
    db.setPassword("root");
    bool ok = db.open();

关联数据库和table view框

设置表名,表头数据,通过setEditStrategy设置不同的编辑策略

QSqlTableModel::OnFieldChange:对模型的所有更改将立即应用于数据库。

QSqlTableModel::OnRowChange:当用户选择其他行时,将应用对行的更改。

QSqlTableModel::OnManualSubmit:所有更改都将缓存在模型中,直到调用 submitAll() 或 revertAll()。

model = new QSqlTableModel(this,db);
    model->setTable("Human");
    model->setHeaderData(0,Qt::Horizontal,QVariant("ID"));
    model->setHeaderData(1,Qt::Horizontal,QVariant("名字"));
    model->setHeaderData(2,Qt::Horizontal,QVariant("年龄"));
    model->setHeaderData(3,Qt::Horizontal,QVariant("性别"));
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->select();
    ui->tableView->setModel(model);

添加:在指定父项的子项中的给定行之前插入一行。

void Widget::on_btn_insert_clicked()
{
    model->insertRow(model->rowCount());
}

确定:submitAll提交所有挂起的更改,并在成功时返回 true。出错时返回 false,详细的错误信息可以通过 lastError() 获取。

void Widget::on_btn_sure_clicked()
{
    model->submitAll();
}

返回:revertAll()还原挂起的更改

void Widget::on_btn_cancel_clicked()
{
    model->revertAll();
    model->select();
}

查询:select()使用指定的筛选器和排序条件

void Widget::on_btn_select_clicked()
{
    model->select();
}

删除:removeRow()从指定父项的子项中删除给定行

void Widget::on_btn_delete_clicked()
{
    int selectRow = ui->tableView->currentIndex().row();
    if(selectRow < 0)
    {
       return;
    }
    model->removeRow(selectRow);
    model->submitAll();
}

升序:setSort :AscendingOrder,升序排列

void Widget::on_btn_asc_clicked()
{
    model->setSort(0,Qt::AscendingOrder);
    model->select();
}

降序:setSort :DescendingOrder,降序排列

void Widget::on_btn_desc_clicked()
{
    model->setSort(0,Qt::DescendingOrder);
    model->select();
}

事物:transaction,返回由参数类型指定的数据库表、系统表和视图的列表

rollback():如果驱动程序支持事务并且已启动 transaction(),则回滚数据库上的事务

commit():如果驱动程序支持事务并且已启动 transaction(),则将事务提交到数据库

void Widget::on_btn_trans_clicked()
{
    //申明一个事物
    model->database().transaction();
    int selectRow = ui->tableView->currentIndex().row();
    if(selectRow < 0)
    {
       return;
    }
    model->removeRow(selectRow);
    bool ret = model->submitAll();
    if(ret)
    {
        int ret = QMessageBox::information(this,"delete tip","你确定要删除选中的行?",
                                 QMessageBox::Yes|QMessageBox::No,QMessageBox::No);
        if(ret == QMessageBox::No)
        {
            model->database().rollback();
        }
        else
        {
            model->database().commit();
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值