您的位置首页>企业动态>

英创信息技术Linux主板Qt数据库应用程序简介

导读大家好,我是极客范的本期栏目编辑小友,现在为大家讲解英创信息技术Linux主板Qt数据库应用程序简介问题。SQLite是一个开源的嵌入式数据库

大家好,我是极客范的本期栏目编辑小友,现在为大家讲解英创信息技术Linux主板Qt数据库应用程序简介问题。

SQLite是一个开源的嵌入式数据库,具有零配置、可移植性好、体积小、高效可靠等特点。同时,SQLite的数据库权限只依赖于文件系统,没有用户账号的概念,使用起来非常方便。Innolux主板可以很好的支持SQLite,光盘上已经提供了相关的测试路线。本文主要介绍了Qt中数据库的开发。

Qt中的QtSql模块提供了数据库支持,这个模块中的很多类基本上可以分为三层:用户界面层、Sql界面层和驱动程序层。

其中,驱动层提供了具体数据库和SQL接口层之间的底层桥梁。SQL接口层提供对数据库的访问;用户界面层中的几个类将数据库中的数据链接到小部件。这些类是通过使用前一章中的模型/视图框架来实现的。它们是更高级别的抽象,即使不熟悉SQL,也可以操作数据库。要在QtQql模块中使用这些类,需要将QT=sql添加到项目文件(。pro文件)。

QtSql模块使用数据库驱动程序与不同的数据库接口进行通信。因为Qt的SQL模型的接口独立于数据库,所以所有特定于数据库的代码都包含在这些驱动程序中。我们使用的免费Qt只为SQLite和ODBC数据库提供驱动程序。创建数据库连接:

qsql database db=qsql database : adddatabase(' QSQLITE ');//指定驱动程序。

db . setdatabasename('/mnt/NAND flash/my . db ');//指定路径。

使用open()函数打开数据库。如果打开失败,将弹出一个对话框:

if(!db.open())

{

qmessagebox :3360 critical(0,qApp-tr('无法打开数据库'),

qApp-tr('无法建立数据库连接'

),qmessagebox : cancel);

返回false

}

使用QSqlQuery创建一个产品表,并插入id、名称和速度三个字段的记录。其中,id字段为int类型,“主键”表示该字段为主键,不能为空,不能有重复值;名称字段属于varchar类型,速度字段也属于varchar类型。请注意,这里使用的所有SQL语句都应该用双引号括起来。如果不能写完一行,每一行都应该在换行后用两个双引号括起来:

QSqlQuery查询;

//创建产品表。

query . exec(QString(' create table product(id int主键')

名称varchar,Speed varchar)'));

query.exec(QString('插入产品值(1,' EM335x ',' 1 GHz ')')));

query.exec(QString('插入产品值(2,' EM3352 ',' 600 MHz ')')));

query.exec(QString('插入产品值(3,' EM9280 ',' 454 MhZ ')')));

表模型提供了一个读/写模型QSqlTableModel,一次只能操作一个SQL表。它可以浏览和修改独立的SQL表,只需要写几个代码,不需要知道SQL语法。默认情况下,模型是可读和可写的。首先,我们创建一个QSqlTableModel,只需使用se table()为其指定一个数据库表,然后使用select()函数进行查询:

model=新的QSqlTableModel(此);

model-Setable(' product ');

model-select();

//设置编辑策略。

model-setEditStrategy(qsql tablemodel : onmanualsubmit);

ui-tableView-setModel(模型);

在使用该模型之前,一般需要设置其编辑策略,由枚举变量qsql表模型:3360编辑策略定义,有三个值:

Qltable模型: onfieldchange:对模型的所有更改都将立即应用于数据库。

QL table model : on row change:当用户选择另一条记录时,将应用对一条记录的更改。

Qltable模型: onmanual submit:在调用submitAll()或revertAll()函数之前,所有更改都将缓存在模型中。

在下面添加一些功能按钮,逐一实现:

//提交修改按钮。

void MainWindow:on _ pushB

utton_clicked(){// 开始事务操作model->database().transaction();if (model->submitAll()) {model->database().commit(); //提交} else {model->database().rollback(); //回滚QMessageBox::warning(this, tr('tableModel'),tr('数据库错误: %1').arg(model->lastError().text()));}}

如果可以使用submitAll()将模型中的修改向数据库提交成功,那么执行commit(),否则进行回滚rollback(),并提示错误信息,下面是撤销修改按钮:

// 撤销修改按钮void MainWindow::on_pushButton_2_clicked(){model->revertAll();}

这里使用了setFilter()函数来进行数据筛选,采用id来筛选:

// 查询按钮,进行筛选void MainWindow::on_pushButton_7_clicked(){QString id = ui->comboBox->currentText();//根据id进行筛选,一定要使用单引号model->setFilter(QString('id = '%1'').arg(id));model->select();}

使用setTable()来指定数据库表,然后使用select()函数进行查询:// 显示全表按钮void MainWindow::on_pushButton_8_clicked(){model->setTable('product');model->select();}

// 按id升序排列按钮void MainWindow::on_pushButton_5_clicked(){//id属性,即第0列,升序排列model->setSort(0, Qt::AscendingOrder);model->select();}

// 按id降序排列按钮void MainWindow::on_pushButton_6_clicked(){model->setSort(0, Qt::DescendingOrder);model->select();}

// 删除选中行按钮void MainWindow::on_pushButton_4_clicked(){// 获取选中的行int curRow = ui->tableView->currentIndex().row();// 删除该行model->removeRow(curRow);int ok = QMessageBox::warning(this,tr('删除当前行!'),tr('你确定删除当前行吗?'), QMessageBox::No,QMessageBox::Yes);if(ok == QMessageBox::No){ // 如果不删除,则撤销model->revertAll();} else { // 否则提交,在数据库中删除该行model->submitAll();}}

// 添加记录按钮void MainWindow::on_pushButton_3_clicked(){// 获得表的行数int rowNum = model->rowCount();int id = rowNum + 1 ;// 添加一行model->insertRow(rowNum);model->setData(model->index(rowNum,0), id);// 可以直接提交//model->submitAll();}

运行效果:

SQLite是一个开源的嵌入式数据库,其特点是零配置,可移植性好,小巧、高效而且可靠。同时SQLite的数据库权限只依赖于文件系统,没有用户帐户的概念,因此使用起来很方便。英创Linux主板能够很好的支持SQLite,相关的测试例程已经在光盘中提供,本文主要简介Qt中的数据库开发。

Qt中的QtSql模块提供了对数据库的支持,该模块中的众多类基本上可以分为三层:用户接口层、SQL接口层,驱动层。

其中驱动层为具体的数据库和SQL接口层之间提供了底层的桥梁;SQL接口层提供了对数据库的访问;用户接口层的几个类实现了将数据库中的数据链接到窗口部件上,这些类是使用前一章的模型/视图框架实现的,它们是更高层次的抽象,即便不熟悉SQL也可以操作数据库。如果要使用QtQql模块中的这些类,需要在项目文件(.pro文件)中添加QT += sql这一行代码。

QtSql模块使用数据库驱动来和不同的数据库接口进行通信。由于Qt的SQL模型的接口是独立于数据库的,所以所有数据库特定的代码都包含在了这些驱动中。我们使用的免费的Qt只提供了SQLite和ODBC数据库的驱动。创建数据库连接:

QSqlDatabase db = QSqlDatabase::addDatabase('QSQLITE'); //指定驱动db.setDatabaseName('/mnt/nandflash/my.db'); //指定路径

使用open()函数将数据库打开,如果打开失败,则弹出对话提示框:if (!db.open()){QMessageBox::critical(0, qApp->tr('Cannot open database'),qApp->tr('Unable to establisha database connection.'), QMessageBox::Cancel);return false;}

使用QSqlQuery创建了一个product表,并插入id,name和speed三个字段的三条记录。其中,id字段是int类型的,''primary key ''表明该字段是主键,它不能为空,而且不能有重复的值;而name字段是varchar类型的,Speed字段也是varchar类型的,注意这里使用的SQL语句都要包含在双引号中,如果一行写不完,那么分行后,每一行都要使用两个双引号引起来:

QSqlQuery query;// 创建product表query.exec(QString ('create table product (id int primary key, ''name varchar, Speed varchar)'));query.exec(QString ('insert into product values(1, 'EM335x', '1GHZ')'));query.exec(QString ('insert into product values(2, 'EM3352', '600MHZ')'));query.exec(QString ('insert intoproduct values(3, 'EM9280', '454MHZ')'));

SQL表格模型提供了一个一次只能操作一个SQL表的读/写模型QSqlTableModel,它可以浏览和修改独立的SQL表,并且只需编写很少的代码,而且不需要了解SQL语法。该模型默认是可读可写的。我们首先创建一个QSqlTableModel,只须使用setTable()来为其指定数据库表,然后使用select()函数进行查询:

model = new QSqlTableModel(this);model->setTable('product');model->select();// 设置编辑策略model->setEditStrategy(QSqlTableModel::OnManualSubmit);ui->tableView->setModel(model);

在使用该模型前,一般还要设置其编辑策略,它由QsqlTableModel::EditStrategy枚举变量定义,一共有三个值:QsqlTableModel::OnFieldChange:所有对模型的改变都会立即应用到数据库。QsqlTableModel::OnRowChange:对一条记录的改变会在用户选择另一条记录时被应用。QsqlTableModel::OnManualSubmit:所有的改变都会在模型中进行缓存,知道调用submitAll()或者revertAll()函数。

下面添加一些功能按钮,逐个实现他们:

// 提交修改按钮void MainWindow::on_pushButton_clicked(){// 开始事务操作model->database().transaction();if (model->submitAll()) {model->database().commit(); //提交} else {model->database().rollback(); //回滚QMessageBox::warning(this, tr('tableModel'),tr('数据库错误: %1').arg(model->lastError().text()));}}

如果可以使用submitAll()将模型中的修改向数据库提交成功,那么执行commit(),否则进行回滚rollback(),并提示错误信息,下面是撤销修改按钮:

// 撤销修改按钮void MainWindow::on_pushButton_2_clicked(){model->revertAll();}

这里使用了setFilter()函数来进行数据筛选,采用id来筛选:

// 查询按钮,进行筛选void MainWindow::on_pushButton_7_clicked(){QString id = ui->comboBox->currentText();//根据id进行筛选,一定要使用单引号model->setFilter(QString('id = '%1'').arg(id));model->select();}

使用setTable()来指定数据库表,然后使用select()函数进行查询:// 显示全表按钮void MainWindow::on_pushButton_8_clicked(){model->setTable('product');model->select();}

// 按id升序排列按钮void MainWindow::on_pushButton_5_clicked(){//id属性,即第0列,升序排列model->setSort(0, Qt::AscendingOrder);model->select();}

// 按id降序排列按钮void MainWindow::on_pushButton_6_clicked(){model->setSort(0, Qt::DescendingOrder);model->select();}

// 删除选中行按钮void MainWindow::on_pushButton_4_clicked(){// 获取选中的行int curRow = ui->tableView->currentIndex().row();// 删除该行model->removeRow(curRow);int ok = QMessageBox::warning(this,tr('删除当前行!'),tr('你确定删除当前行吗?'), QMessageBox::No,QMessageBox::Yes);if(ok == QMessageBox::No){ // 如果不删除,则撤销model->revertAll();} else { // 否则提交,在数据库中删除该行model->submitAll();}}

// 添加记录按钮void MainWindow::on_pushButton_3_clicked(){// 获得表的行数int rowNum = model->rowCount();int id = rowNum + 1 ;// 添加一行model->insertRow(rowNum);model->setData(model->index(rowNum,0), id);// 可以直接提交//model->submitAll();}

运行效果:

.dfma { position: relative; width: 1000px; margin: 0 auto; } .dfma a::after { position: absolute; left: 0; bottom: 0; width: 30px; line-height: 1.4; text-align: center; background-color: rgba(0, 0, 0, .5); color: #fff; font-size: 12px; content:"广告"; } .dfma img { display: block; }
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。