QT提供了三个高级的类来访问数据库,分别是QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel。这三个类可以很容易的实现将数据库中的数据在QListView和QTableView等视图类中显示;也可以是编写的代码很容易地适应其他数据源。下面用实例说明。
新建GUI应用,项目名称为sqlModel,基类为QMainwindow。打开.pro文件,添加代码:
QT+=sql
打开.ui文件,向窗口中拖入label、PushButton、Line Edit和Table View部件,效果如图:
添加头文件connection.h,实现数据库的连接,代码如下:
#ifndef CONNECTION_H
#define CONNECTION_H
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
static bool createConnection()
{
QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("my.db");
if(!db.open())
{
QMessageBox::critical(0,"Cannot open database1","Unable to establish a database connection.",QMessageBox::Cancel);
return false;
}
QSqlQuery query;
//创建student表
query.exec(QString("create table student(id int primary key,name varchar,course int)"));
query.exec(QString("insert into student value(1,'李强',11)"));
query.exec(QString("insert into student value(2,'马亮',11)"));
query.exec(QString("insert into student value(3,'孙红',12)"));
//创建course表
query.exec(QString("create table course(id int primary key,name varchar,teacher varchar)"));
query.exec(QString("insert into course value(10,'数学','王老师')"));
query.exec(QString("insert into course value(11,'英语','张老师')"));
query.exec(QString("insert into course value(12,'计算机','白老师')"));
return true;
}
#endif // CONNECTION_H
更改main.cpp文件,代码如下:
#include "mainwindow.h"
#include <QApplication>
#include "connection.h"
#include <QTextCodec>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
if(!createConnection()) return 1;
MainWindow w;
w.show();
return a.exec();
}
在mainwindow.h文件中,添加类的前置声明:
class QSqlTableModel;
燃耗定义一个私有对象:
QSqlTableModel *model;
下面实现各个功能。进入各个功能的单击信号槽,添加代码,代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlQueryModel>
#include <QSqlTableModel>
#include <QSqlRelationalTableModel>
#include <QTableView>
#include <QDebug>
#include <QMessageBox>
#include <QSqlError>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
model = new QSqlTableModel(this);
model->setTable("student");
model->select();
// 设置编辑策略
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
ui->tableView->setModel(model);
}
MainWindow::~MainWindow()
{
delete ui;
}
//提交按钮
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()));
}
}
//撤销按钮
void MainWindow::on_pushButton_2_clicked()
{
model->revertAll();
}
//查询
void MainWindow::on_pushButton_7_clicked()
{
QString name=ui->lineEdit->text();
//根据姓名进行筛选,一定要使用单引号
model->setFilter(QString("name='%1'").arg(name));
model->select();
}
//显示全表按钮
void MainWindow::on_pushButton_8_clicked()
{
model->setTable("student");
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::Yes,QMessageBox::No);
if(ok==QMessageBox::No)
{
model->revertAll();//如果不删除,泽撤销
}
else
{
//否则提交,在数据库中删除该行
model->submitAll();
}
}
//添加记录
void MainWindow::on_pushButton_3_clicked()
{
//获取表的行数
int rowNum=model->rowCount();
int id=10;
//添加一行
model->insertRow(rowNum);
model->setData(model->index(rowNum,0),id);
//可以直接提交
model->submitAll();
}
运行程序,即可实现各功能。