数据库查询结果显示到表格
Qt中提供了专门显示表格的类 ------------ QTableView
QTableView在显示表格内容时,可以先把显示的内容写入到QStandardItemMode模型对象中,再将模型对象和表格对象绑定,绑定后模型的内容就会同步显示到表格中。
如何绑定表格和模型
QTableView的成员函数:
setModel(模型对象);
如何设置模型的内容
QStandardItemMode的成语函数:
设置列头部标题:setHorizontalHeaderItem(列,QStandardItem *item);
设置单元格内容:setItem(行,列,QStandardItem *item);
删除指定的行:removeRows(起始行号,行数);
获取行数:rowCount();
清空:clear();
Qt中的数据库模块
Qt的开发环境集成了数据库访问的功能,也自带数据库sqlite,也用于其他类型数据(mysql)的接口,同时还提供了多种访问数据库的类,通过这些类就可以实现对数据库的访问。
使用Qt的数据库模块需要在项目文件中添加:
QT += sql
数据库驱动类 ----------- QSqlDatabase
成员函数:
1.addDatabase -------- 添加数据库驱动
[static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type,
const QString &connectionName = QLatin1String(defaultConnection));
//需要传入添加的数据库类型,比如使用sqlite就穿"QSQLITE"
//返回被类型对象
2.setDatabaseName -------- 设置数据库文件路径
void QSqlDatabase::setDatabaseName(const QString &name);
//传入数据库文件的路径,添加数据库驱动成功后才能调用该函数
3.open ----------- 打开数据库
bool QSqlDatabase::open();
//设置数据库路径后才能打开,返回成功/失败
执行SQL语句的类 -------- QSqlQuery
成员函数:
1.exec() ------- 执行sql语句
bool QSqlQuery::exec(const QString &query);
//传入要执行的sql语句(不需要加分号),不传参数就执行构造时的sql语句
//返回执行成功/失败
2.lastError ------- 获取错误原因
QSqlError QSqlQuery::lastError() const;
3.next --------- 获取sql语句执行的结果(查询)
bool QSqlQuery::next();
//每调用一次取出一条结果,返回的结果是在对象中,通过value成员函数获取
//数据全部取完返回false,否则返回true
QVariant QSqlQuery::value(int index) const;//通过编号获取字段值
QVariant QSqlQuery::value(const QString &name) const;//通过字段名获取字段值
练习:
完成Qt数据库的删除和更新的功能
使用数据库实现登录
数据加密和混淆 ------------- MD5/SHA1/SHA2/SHA3
MD5是一种将任意长度的数据变换得到128位2进制数据,无法通过128位2进制数据求的原始数据。在Qt中的使用:
创建一个加密对象
QCryptographicHash hash(QCryptographicHash::Md5);
放入要加密的数据
void QCryptographicHash::addData(const QByteArray &data);
//hash.addData(password.toUtf8());
获取加密结果
QByteArray QCryptographicHash::result() const;
//hash.result();
Qt数据库的数据模型 ----------- QSqlTableModel
只有增删改查,建表还要打原始的命令
数据库的数据模型是将SQL语句对数据库的访问完全对象化,将SQL语句的执行封装成对象及其成员函数的实现,同时也对象化了Qt的表格界面,实现了数据库访问的高耦合性,屏蔽了数据库访问的内部细节,将数据库的访问简化成调用对象的接口(成员函数)。
QSqlTableModel类:
成员函数:
1.绑定表(数据库的表) --------- setTable
[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);
column 插入的列数 从0开始
//传入按照哪一列,用什么方式排序
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.修改 --------- 查询+插入
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);
直接修改模型中的数据 ------ 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;
//通过行和列求编号
7.撤销修改 ------ revert/revertAll
[override virtual slot] void QSqlTableModel::revert();
[slot] void QSqlTableModel::revertAll();
练习:
将数据库模型中的修改完成
作业: