qt - 数据库

该文介绍了Qt框架下对数据库的分层操作,包括驱动层、SQL接口层和用户接口层。通过C++代码示例展示了如何使用SQL接口层进行数据库连接、创建表、插入、更新和查询数据。同时,也演示了如何在Widget用户界面中使用QSqlTableModel来显示和操作数据。
摘要由CSDN通过智能技术生成

qt 数据库

SQL 模块分层机制

驱动层(底层):用于控制数据库,且连接sql接口层,相当于sql接口层和数据库之间的桥梁
sql接口层:各种的指令与函数访问数据库 sqlDataBase,这些指令是数据库的原生指令
用户接口层:将数据库的内容,链接到窗口部件上,sql_xxx_model 基于该层的类和函数,可以实现在窗体内对数据库的显示修改等内容

如果这时利用c++代码实现对数据库的操作,使用sql接口层就可以
如果想在widget窗体内进行操作,就需要使用用户接口层

sql语句 - sql接口层

/* .pro */
QT       += sql
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // sqldatabase 是sql接口层
    QStringList drivers=QSqlDatabase::drivers();
    foreach (const QString &driver, drivers) {
        qDebug()<<driver;
    }

    // 创建一个数据库对象
//    sqlLite=new QSqlDriver(this); // ERROR
    QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("mydataset.db");

    // 默认路径是.pro文件的包含路径
    if (!db.open())
    {
        qDebug()<<"ERROR: dataset.db can not open...";
        qDebug()<<db.lastError();
    }
    else
    {
        qDebug()<<"SUCCESS: dataset.db connected...";
    }

    // 创建查询对象
    // QSqlQuery类,类中有很多方法,各种方法可以操作数据库
    QSqlQuery sqlQuery(db);

    // 查找tables
    QStringList tables=db.tables(QSql::Tables);
    qDebug()<<"tables info: ";
    for(const QString &table:tables)
    {
        qDebug()<<table;
    }

    QString command; // sql语句


    // 防止重复创建 与清空
    if (!tables.contains("student"))
    {
        // 创建表
        command=QString("CREATE TABLE student(%1,%2,%3)")
                                .arg(QString("id INT"))
                                .arg(QString("name VARCHAR(20)"))
                                .arg(QString("age INT"));

        sqlQuery.prepare(command); // 准备
        if (!sqlQuery.exec()) // 执行语句
        {
            qDebug()<<"ERROR: failed to create table...";
            qDebug()<<sqlQuery.lastError();
        }
        else
        {
            qDebug()<<"SUCCESS: table created...";
        }
//        sqlQuery.finish();
    }
    else
    {
        // 清空表
        command=QString("DELETE FROM student ");
        sqlQuery.prepare(command);
        if (!sqlQuery.exec()) // 执行语句
        {
            qDebug()<<"ERROR: failed to clear table...";
            qDebug()<<sqlQuery.lastError();
        }
        else
        {
            qDebug()<<"SUCCESS: table clear...";
        }
    }

    // 插入数据
    // version 1
    command=QString("INSERT INTO student (id,name,age)");
    command+=QString("values(:id,:name,:age)");
    sqlQuery.prepare(command);
    sqlQuery.bindValue(":id",1);
    sqlQuery.bindValue(":name","li");
    sqlQuery.bindValue(":age",20);

    if (!sqlQuery.exec())
    {
        qDebug()<<"ERROR: "<<sqlQuery.lastError();
    }
    else
    {
        qDebug()<<"SUCCESS: insert a info";
    }
//    sqlQuery.finish();

    // version 2
    command=QString("INSERT INTO student (id,name,age)\n");
    command+=QString("values(?,?,?)");
    sqlQuery.prepare(command);
    sqlQuery.addBindValue(2);
    sqlQuery.addBindValue("zhang");
    sqlQuery.addBindValue(21);
    if (!sqlQuery.exec())
    {
        qDebug()<<"ERROR: "<<sqlQuery.lastError();
    }
    else
    {
        qDebug()<<"SUCCESS: insert a info";
    }
//    sqlQuery.finish();

    /*
        // version 3 ERROR 不能用Qstring这种方式初始化
        command=QString("INSERT INTO student (id,name,age) values(%1,%2,%3)").arg(QString::number(3)).arg("wang").arg(QString::number(23));
        sqlQuery.prepare(command);
        if (!sqlQuery.exec())
        {
            qDebug()<<"ERROR: "<<sqlQuery.lastError();
        }
        else
        {
            qDebug()<<"SUCCESS: insert a info";
        }
    */

    // 显示所有信息
    command=QString("SELECT * from student");
    sqlQuery.prepare(command);
    if (!sqlQuery.exec())
    {
        qDebug()<<"ERROR: "<<sqlQuery.lastError();
    }
    else
    {
        const char *data_format="%-10d%-10s%-10d";
        qDebug("%-10s%-10s%-10s","id","name","age");
        while (sqlQuery.next())
        {
            int id=sqlQuery.value(0).toInt(); // 将sql语句中的数据类型转换成qt中的数据类型
            QString name=sqlQuery.value(1).toString();
            QByteArray name_tmp=name.toLatin1();
            int age=sqlQuery.value(2).toInt();

            qDebug(data_format,id,name_tmp.data(),age);
        }
    }
//    sqlQuery.finish();

    // 更新数据
    command=QString("UPDATE student SET name= :_name WHERE id=:_id");
    sqlQuery.prepare(command);
    sqlQuery.bindValue(":_name","wang");
    sqlQuery.bindValue(":_id",1);
    if (!sqlQuery.exec())
    {
        qDebug()<<"ERROR: "<<sqlQuery.lastError();
    }
    else
    {
        qDebug()<<"SUCCESS: update a info";
    }

    command=QString("SELECT * from student");
    sqlQuery.prepare(command);
    if (!sqlQuery.exec())
    {
        qDebug()<<"ERROR: "<<sqlQuery.lastError();
    }
    else
    {
        const char *data_format="%-10d%-10s%-10d";
        qDebug("%-10s%-10s%-10s","id","name","age");
        while (sqlQuery.next())
        {
            int id=sqlQuery.value(0).toInt(); // 将sql语句中的数据类型转换成qt中的数据类型
            QString name=sqlQuery.value(1).toString();
            QByteArray name_tmp=name.toLatin1();
            int age=sqlQuery.value(2).toInt();

            qDebug(data_format,id,name_tmp.data(),age);
        }
    }

}

Widget::~Widget()
{
    delete ui;
}

sql - 用户层

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSqlDatabase>
#include <QSqlDriver> // 接口层
#include <QSqlQuery> // 接口层
#include <QSqlError> // 接口层
#include <QSqlQueryModel> // 用户层
#include <QSqlTableModel> // 用户层
#include <QSqlRelationalTableModel> // 用户层
#include <QTableView>


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

private:
    Ui::Widget *ui;

    QSqlTableModel *model;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // sqldatabase 是sql接口层
    QStringList drivers=QSqlDatabase::drivers();
    foreach (const QString &driver, drivers) {
        qDebug()<<driver;
    }

    // 创建一个数据库对象
    QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("mydataset.db");

    // 默认路径是.pro文件的包含路径
    if (!db.open())
    {
        qDebug()<<"ERROR: dataset.db can not open...";
        qDebug()<<db.lastError();
    }
    else
    {
        qDebug()<<"SUCCESS: dataset.db connected...";
    }

    // 创建查询对象
    // QSqlQuery类,类中有很多方法,各种方法可以操作数据库
    QSqlQuery sqlQuery(db);

    // 查找tables
    QStringList tables=db.tables(QSql::Tables);
    qDebug()<<"tables info: ";
    for(const QString &table:tables)
    {
        qDebug()<<table;
    }

    QString command; // sql语句

    // 防止重复创建 与清空
    if (!tables.contains("student"))
    {
        // 创建表
        command=QString("CREATE TABLE student(%1,%2,%3)")
                                .arg(QString("id INT"))
                                .arg(QString("name VARCHAR(20)"))
                                .arg(QString("age INT"));

        sqlQuery.prepare(command); // 准备
        if (!sqlQuery.exec()) // 执行语句
        {
            qDebug()<<"ERROR: failed to create table...";
            qDebug()<<sqlQuery.lastError();
        }
        else
        {
            qDebug()<<"SUCCESS: table created...";
        }
    }
    else
    {
        // 清空表
        command=QString("DELETE FROM student ");
        sqlQuery.prepare(command);
        if (!sqlQuery.exec()) // 执行语句
        {
            qDebug()<<"ERROR: failed to clear table...";
            qDebug()<<sqlQuery.lastError();
        }
        else
        {
            qDebug()<<"SUCCESS: table clear...";
        }
    }

    // 插入数据
    // version 1
    command=QString("INSERT INTO student (id,name,age)");
    command+=QString("values(:id,:name,:age)");
    sqlQuery.prepare(command);
    sqlQuery.bindValue(":id",1);
    sqlQuery.bindValue(":name","li");
    sqlQuery.bindValue(":age",20);

    if (!sqlQuery.exec())
    {
        qDebug()<<"ERROR: "<<sqlQuery.lastError();
    }
    else
    {
        qDebug()<<"SUCCESS: insert a info";
    }

    // version 2
    command=QString("INSERT INTO student (id,name,age)\n");
    command+=QString("values(?,?,?)");
    sqlQuery.prepare(command);
    sqlQuery.addBindValue(2);
    sqlQuery.addBindValue("zhang");
    sqlQuery.addBindValue(21);
    if (!sqlQuery.exec())
    {
        qDebug()<<"ERROR: "<<sqlQuery.lastError();
    }
    else
    {
        qDebug()<<"SUCCESS: insert a info";
    }

    // 显示所有信息
    command=QString("SELECT * from student");
    sqlQuery.prepare(command);
    if (!sqlQuery.exec())
    {
        qDebug()<<"ERROR: "<<sqlQuery.lastError();
    }
    else
    {
        const char *data_format="%-10d%-10s%-10d";
        qDebug("%-10s%-10s%-10s","id","name","age");
        while (sqlQuery.next())
        {
            int id=sqlQuery.value(0).toInt(); // 将sql语句中的数据类型转换成qt中的数据类型
            QString name=sqlQuery.value(1).toString();
            QByteArray name_tmp=name.toLatin1();
            int age=sqlQuery.value(2).toInt();

            qDebug(data_format,id,name_tmp.data(),age);
        }
    }

    // 创建对象
    model =new QSqlTableModel(this);
    ui->tableView->setModel(model); // 用tableview显示model
    model->setTable("student");
    model->select(); // 直接显示信息

//    model->setHeaderData(0,Qt::Horizontal,"学号");
//    model->setHeaderData(1,Qt::Horizontal,"姓名");
//    model->setHeaderData(2,Qt::Horizontal,"年龄");

    // 修改模型更新策略
    model->setEditStrategy(QSqlTableModel::OnManualSubmit); // 手动提交,只有调用特定函数才能更新或者撤销成功
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_clicked()
{
    model->submitAll(); // 提交
}



void Widget::on_pushButton_2_clicked()
{
    model->revertAll(); // 撤销
    model->submitAll();
}


void Widget::on_pushButton_3_clicked()
{
    // 查找
    QString name=ui->lineEdit->text();

    if (!name.isEmpty())
    {
        model->setFilter(QString("name = '%1'").arg(name));
    }
    else
    {
        model->setFilter(""); // 取消筛选
    }
    model->select(); // 用于在tableview显示
}


.ui

在这里插入图片描述

MIT-BIH QT数据库是一种包含人类心电图数据的公开数据库,用于研究心脏的电生理特征和心脏疾病的识别与分析。该数据库由麻省理工学院(MIT)和美国国立卫生研究院(NIH)的比坚锡医院(BIH)合作创建,并于1980年发布。 MIT-BIH QT数据库主要包含来自多个健康志愿者和心脏病人的心电图信号,总计500个记录。这些心电图记录在不同的情况下采集,包括静息、运动、药物影响等等。在记录过程中,心电图信号被模拟器进行测量,并通过标准12导联记录,以及记录人员的相关生理和临床信息。 MIT-BIH QT数据库的主要目的是提供一个对心脏r波的测量结果进行快速和可靠分析的参考标准。研究人员可以利用这一数据库开发和验证心脏疾病的自动识别算法,以及其他相关的心脏研究。 对于心脏病学和生物医学工程学领域的研究人员来说,MIT-BIH QT数据库是一个非常有价值的资源。它为研究心脏疾病的机理、心脏节律障碍和药物对心电图的影响提供了丰富的数据。通过分析和处理MIT-BIH QT数据库中的心电图信号,研究人员可以进一步理解心脏的电生理过程,并且为心脏疾病的诊断和治疗提供更多的依据。 总之,MIT-BIH QT数据库是一个被广泛应用于心脏研究的公开数据库,它对于研究人员来说是一个宝贵的资源,可以帮助他们深入了解心脏疾病的机理和识别方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值