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

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();

}

运行效果:

eeb15c75a772cbfba06978d0fb6aa361.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值