QT中使用sql模型类

来源:互联网 发布:mvc,return json(obj) 编辑:程序博客网 时间:2024/06/05 18:42

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

    运行程序,即可实现各功能。