QT中使用sql模型类

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

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

Qt ORM(对象关系映射)和Qt SQLQt框架用于数据库操作的两个组件。Qt SQL提供了对SQL数据库的访问支持,而Qt ORM则是基于Qt SQL之上,提供了一种更高级的数据库交互方式,使得可以像操作对象一样操作数据库的数据。 1. **Qt SQL使用**: Qt SQL提供了一组来帮助应用程序执行SQL语句并处理结果,它包括用于执行SQL命令和处理查询结果的`QSqlDatabase`、`QSqlQuery`、`QSqlError`等。 - **初始化数据库连接**:使用`QSqlDatabase`添加和管理数据库连接。 - **执行SQL命令**:通过`QSqlQuery`来执行SQL语句,可以用来执行INSERT、UPDATE、DELETE等操作。 - **查询数据**:`QSqlQuery`也可以用来查询数据,并通过迭代器模式遍历查询结果。 2. **Qt ORM的使用**: Qt ORM主要借助Qt SQL模块实现,它允许开发者通过映射数据库表到,并通过实例来操作数据库。 - **定义模型**:创建与数据库表相对应的C++使用`Q_OBJECT`宏,并声明与表字段相对应的属性。 - **数据库表与的映射**:使用元对象编译器(moc)来处理这些,它们通常需要使用特定的宏,如`QTableName`、`QPrimaryKey`等来指示如何进行映射。 - **操作数据**:创建和使用这些的实例来插入、更新和删除数据库的记录。 以下是一个简单的示例来说明Qt SQLQt ORM的使用: ```cpp // 使用Qt SQL进行查询 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); db.setDatabaseName("mydatabase"); db.setUserName("user"); db.setPassword("password"); if (!db.open()) { qDebug() << "Error: " << db.lastError(); return; } QSqlQuery query("SELECT * FROM my_table"); while (query.next()) { QString column1Value = query.value(0).toString(); int column2Value = query.value(1).toInt(); // 处理查询结果... } // 使用Qt ORM操作数据库 class MyModel : public QObject { Q_OBJECT QTableName("my_table") QPrimaryKey("id") public: Q_PROPERTY(int id READ getId WRITE setId NOTIFY idChanged) Q_PROPERTY(QString name READ getName WRITE setName NOTIFY nameChanged) int getId() const { return id; } void setId(int newId) { id = newId; } QString getName() const { return name; } void setName(const QString &newName) { name = newName; } private: int id; QString name; }; // 使用MyModel来操作数据库的my_table表 MyModel model; model.setId(1); // 根据ID获取数据 if(model.getName().isEmpty()) { // 数据不存在,可以进行创建操作 model.setName("New Name"); model.setId(1); // 假设数据库已经存在一个ID为1的记录 model.insert(); // 插入新记录到数据库 } else { // 更新已有记录 model.setName("Updated Name"); model.update(); // 更新数据库的记录 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值