一、定义

数据库的数据模型是将SQL语句对数据库的访问完全对象化,将SQL语句的执行封装成对象及其成员函数的实现,同时也对象化了QT的表格界面,实现了数据库访问的高耦合性,屏蔽了数据库访问的内部细节,将数据库的访问简化成调用对象的接口(成员函数)。
在这里插入图片描述

二、QSqlTableModle类

成员函数:
1.绑定表格(数据库的表)

[virtual] void QSqlTableModel::setTable(const QString &tableName);
//传入表格名

2.插入
插入一条记录 ------- insertRecord

bool QSqlTableModel::insertRecord(int row, const QSqlRecord &record);
//先构建一条QSqlRecord,再插入指定行
插入一行 ----------- insertRow
bool QAbstractItemModel::insertRow(int row, const QModelIndex &parent = QModelIndex());
//传入第几行

3.提交模型数据到数据库 ----------- submit/submitAll

[override virtual slot] bool QSqlTableModel::submit();
[slot] bool QSqlTableModel::submitAll();

4.查询 ------------ select

[virtual slot] bool QSqlTableModel::select();
//每次查询前应该重新绑定表格,如果需要显示就绑定模型和表格界面
//查找也可以设置过滤器和排序方法
[virtual] void QSqlTableModel::setFilter(const QString &filter);
//传入的字符串格式类似于 "字段名=字段值"
[virtual] void QSqlTableModel::setSort(int column, Qt::SortOrder order);
//传入按哪一列,用什么方式排序
    Qt::AscendingOrder ----- 升序
    Qt::DescendingOrder ---- 降序

5.从模型中删除行 ---------- removeRow/removeRows

[override virtual] bool QSqlTableModel::removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
//传入哪一行开始一共多少行
[override virtual] int QSqlTableModel::rowCount(const QModelIndex &parent = QModelIndex()) const;
//返回当前模型中的行数
bool QAbstractItemModel::removeRow(int row, const QModelIndex &parent = QModelIndex());
//删除指定行

6.修改 = 查询+插入
(1) select+record(…)+记录的setValue+setRecord

//如何获取QSqlRecord
QSqlRecord QSqlTableModel::record() const;//获取一条空记录
QSqlRecord QSqlTableModel::record(int row) const;//获取指定行的记录
//QSqlRecord的修改字段成员函数
    void QSqlRecord::setValue(int index, const QVariant &val);//通过编号修改
    void QSqlRecord::setValue(const QString &name, const QVariant &val);//通过字段名修改
//修改记录
bool QSqlTableModel::setRecord(int row, const QSqlRecord &values);//修改指定行的记录

(2) 直接修改模型中的数据 ------- setData

[override virtual] bool QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
//传入要修改的位置编号和内容
[override virtual] QModelIndex QAbstractTableModel::index(int row, int column, const QModelIndex &parent = ...) const;
//通过行和列获取index编号

7.撤销修改 ------ revert/revertAll

[override virtual slot] void QSqlTableModel::revert();
[slot] void QSqlTableModel::revertAll();    

测试代码:

#include "smartsqlstu.h"
#include "ui_smartsqlstu.h"
#include <QMessageBox>


SmartSQLStu::SmartSQLStu(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::SmartSQLStu)
{
    ui->setupUi(this);

    //1.添加数据库驱动
    db = QSqlDatabase::addDatabase("QSQLITE");
    //2.指定数据库文件路径
    db.setDatabaseName("stu.db");
    //3.打开数据库
    if(!db.open()){
        QMessageBox::warning(this,"提示","打开数据库失败!");
    }

    //初始化模型
    model = new QSqlTableModel(this);
}

SmartSQLStu::~SmartSQLStu()
{
    delete ui;
}

//建表
void SmartSQLStu::on_pushButton_createtab_clicked()
{
    QString sql = QString("create table if not exists %1(id int unique,name nvarchar,age int)")
                  .arg(ui->lineEdit_tabname->text());

    //QSqlQuery执行sql
    QSqlQuery query;
    if(!query.exec(sql)){//失败
        QMessageBox::warning(this,"提示","建表失败!");
        return;
    }

    model->setTable(ui->lineEdit_tabname->text());
    //设置提交后生效
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    //显示
    model->select();
    ui->tableView->setModel(model);

    //禁止创建,使能操作
    ui->lineEdit_tabname->setEnabled(false);
    ui->pushButton_createtab->setEnabled(false);
    ui->pushButton_add->setEnabled(true);
    ui->pushButton_save->setEnabled(true);
    ui->pushButton_delete->setEnabled(true);
    ui->pushButton_revert->setEnabled(true);
    ui->pushButton_select->setEnabled(true);
}

//添加
void SmartSQLStu::on_pushButton_add_clicked()
{
    //获取当前的行数
    int row = model->rowCount();
    //在末尾插入一行
    model->insertRow(row);
    int id = 100;
    model->setData(model->index(row,0),id);

    //提交
    model->submitAll();
}

//保存
void SmartSQLStu::on_pushButton_save_clicked()
{
    model->submitAll();
}

//撤销
void SmartSQLStu::on_pushButton_revert_clicked()
{
    model->revertAll();
}

//删除选中行
void SmartSQLStu::on_pushButton_delete_clicked()
{
    //从表格中获取要删除的行
    int delrow = ui->tableView->currentIndex().row();
    //删除
    model->removeRow(delrow);

    //再次询问用户是否真的删除
    if(QMessageBox::Yes==QMessageBox::warning(this,"删除","确定要删除吗?",QMessageBox::Yes|QMessageBox::No)){
        model->submitAll();
    }
    else{
        model->revertAll();
    }
}

// 查询
void SmartSQLStu::on_pushButton_select_clicked()
{
    model->setTable(ui->lineEdit_tabname->text());
    model->select();
}

测试结果
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐