Qt|Qt Creator (9)————数据库操作

目录
Qt 提供了 QtSql 模块来提供平台独立的基于 SQL 的数据库操作。Qt 的数据库操作还可以很方便的与 model/view 架构进行整合。Qt 使用QSqlDatabase表示一个数据库连接。更底层上,Qt 使用驱动(drivers)来与不同的数据库 API 进行交互。
Qt 桌面版本提供了如下几种驱动:
Qt|Qt Creator (9)————数据库操作
文章图片

Qt|Qt Creator (9)————数据库操作
文章图片


  • 数据库操作:
使用 SQL 语句,我们可以选择QSqlQuery类,在使用时,我们可以通过以下语句找到系统中所有可用的数据库驱动的名字列表。我们只能使用出现在列表中的驱动。
QSqlDatabase::drivers();
为了使用有关数据库的类,我们必须早 .pro 文件中添加这么一句:
QT += sql
下面来看一个简单的程序:
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); //打印Qt支持的数据库驱动 qDebug() << QSqlDatabase::drivers(); //添加MySql数据库 QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL"); //连接数据库 db.setHostName("localhost"); db.setUserName("root"); db.setPassword("123456"); db.setDatabaseName("info"); //打开数据库 if(!db.open()) { QMessageBox::warning(this,"错误",db.lastError().text()); return; }QSqlQuery query; query.exec(); }

我们使用connect()函数创建一个数据库连接。我们使用QSqlDatabase::addDatabase()静态函数完成这一请求,也就是创建了一个QSqlDatabase实例。

  • 使用模型操作数据库:
查询操作
首先我们来看看如何使用QSqlTableModel 进行 SELECT 操作:
if (connect("demo.db")) { QSqlTableModel model; model.setTable("student"); model.setFilter("age > 20 and age < 25"); if (model.select()) { for (int i = 0; i < model.rowCount(); ++i) { QSqlRecord record = model.record(i); QString name = record.value("name").toString(); int age = record.value("age").toInt(); qDebug() << name << ": " << age; } } } else { return 1; }

使用QSqlTableModel::select()函数进行操作,也就是执行了查询操作。如果查询成功,函数返回 true,由此判断是否发生了错误。如果没有错误,我们使用record()函数取出一行记录,该记录是以QSqlRecord的形式给出的,而QSqlRecord::value()则取出一个列的实际数据值。

插入操作
下面一段代码则显示了如何使用QSqlTableModel进行插入操作:
QSqlTableModel model; model.setTable("student"); int row = 0; model.insertRows(row, 1); model.setData(model.index(row, 1), "Cheng"); model.setData(model.index(row, 2), 24); model.submitAll();

插入也很简单:model.insertRows(row, 1); 说明我们想在索引 0 的位置插入 1 行新的数据。使用setData()函数则开始准备实际需要插入的数据。注意这里我们向 row 的第一个位置写入 Cheng(通过model.index(row, 1),最后,调用submitAll()函数提交所有修改。

更新操作
当我们取出了已经存在的数据后,对其进行修改,然后重新写入数据库,即完成了一次更新操作:
QSqlTableModel model; model.setTable("student"); model.setFilter("age = 25"); if (model.select()) { if (model.rowCount() == 1) { QSqlRecord record = model.record(0); record.setValue("age", 26); model.setRecord(0, record); model.submitAll(); } }

这段代码中,我们首先找到 age = 25 的记录,然后将 age 重新设置为 26,存入相同的位置(在这里都是索引 0 的位置),提交之后完成一次更新。当然,我们也可以类似其它模型一样的设置方式:setData()函数。

删除操作
删除操作同更新类似:
QSqlTableModel model; model.setTable("student"); model.setFilter("age = 25"); if (model.select()) { if (model.rowCount() == 1) { model.removeRows(0, 1); model.submitAll(); } }

当我们看到removeRows()函数就应该想到:我们可以一次删除多行。

  • 可视化显示数据库数据:
使用QSqlQuery的方式创建student 表
int main(int argc, char *argv[]) { QApplication a(argc, argv); if (connect("demo.db")) { QSqlTableModel *model = new QSqlTableModel; model->setTable("student"); model->setSort(1, Qt::AscendingOrder); model->setHeaderData(1, Qt::Horizontal, "Name"); model->setHeaderData(2, Qt::Horizontal, "Age"); model->select(); QTableView *view = new QTableView; view->setModel(model); view->setSelectionMode(QAbstractItemView::SingleSelection); view->setSelectionBehavior(QAbstractItemView::SelectRows); //view->setColumnHidden(0, true); view->resizeColumnsToContents(); view->setEditTriggers(QAbstractItemView::NoEditTriggers); QHeaderView *header = view->horizontalHeader(); header->setStretchLastSection(true); view->show(); } else { return 1; } return a.exec(); }

我们在main()函数中创建了QSqlTableModel对象,使用 student 表。student 表有三列:id,name 和 age,我们选择按照 name 排序,使用setSort()函数达到这一目的。然后我们设置每一列的列头。这里我们只使用了后两列,第一列没有设置,所以依旧显示为列名 id。在设置好 model 之后,我们又创建了QTableView对象作为视图。注意这里的设置:单行选择,按行选择。resizeColumnsToContents()说明每列宽度适配其内容;setEditTriggers()则禁用编辑功能。最后,我们设置最后一列要充满整个窗口。我们的代码中有一行注释,设置第一列不显示。
【Qt|Qt Creator (9)————数据库操作】Qt|Qt Creator (9)————数据库操作
文章图片

    推荐阅读