qt SQLite学习记录

news2024/9/20 18:35:38

1. 查看qt中数据库的驱动的类型的支持

QStringList drivers = QSqlDatabase::drivers();//获取qt中所支持的数据库驱动类型

    foreach(QString driver,drivers)
    {
        qDebug()<<driver;
    }
 

在这里插入图片描述

2. Qt SQL 模块包含的主要类的功能介绍

Qt SQL 模块包含了一些主要的类,用于在 Qt 应用程序中实现数据库操作。以下是几个主要类的功能介绍:

  1. QSqlDatabase:用于表示数据库连接的类。通过 QSqlDatabase 类,可以建立和管理数据库连接,并执行数据库操作。

  2. QSqlQuery:用于执行 SQL 查询的类。通过 QSqlQuery 类,可以执行各种 SQL 查询语句,如 SELECT、INSERT、UPDATE、DELETE 等,并获取查询结果。

  3. QSqlTableModel:用于绑定数据库表格的类。通过 QSqlTableModel 类,可以将数据库表格和 Qt 的模型/视图框架相结合,实现数据的展示和编辑。

  4. QSqlRelationalTableModel:用于处理关系型数据库表格的类。通过 QSqlRelationalTableModel 类,可以处理包含外键关系的数据库表格,并在 UI 中显示相关联的数据。

  5. QSqlQueryModel:用于执行 SQL 查询并在视图中显示结果的类。通过 QSqlQueryModel 类,可以执行 SQL 查询并将结果集显示在 Qt 的视图组件中,如 QTableView、QListView 等。

  6. QSqlRelationalDelegate:用于管理数据库表格中外键列的类。通过 QSqlRelationalDelegate 类,可以为外键列提供自定义的展示和编辑行为。

  7. QSqlError:表示数据库错误信息的类。通过 QSqlError 类,可以获取数据库操作时可能发生的错误信息,便于进行错误处理和调试。

总的来说,Qt SQL 模块提供了一系列的类和方法,方便开发者在 Qt 应用程序中实现数据库操作和数据展示功能。

3. QSqlDatabase操作主要接口

方法描述
addDatabase(const QString &type)添加一个数据库连接,并指定数据库类型。
removeDatabase(const QString &name)移除指定名称的数据库连接。
database(const QString &connectionName = defaultConnection)返回指定名称的数据库连接。
contains(const QString &connectionName)检查是否存在指定名称的数据库连接。
setDatabaseName(const QString &name)设置连接的数据库名称。
setUserName(const QString &name)设置连接的用户名。
setPassword(const QString &password)设置连接的密码。
open()打开数据库连接。
isOpen()检查数据库连接是否打开。
close()关闭数据库连接。
tables(QSql::TableType type = Tables)返回数据库中的表格列表。
exec(const QString &query)执行 SQL 查询语句。
commit()提交数据库事务。
rollback()回滚数据库事务。
lastError()返回最后一个数据库操作的错误信息。
  • 范例示范
QSqlDatabase db;//对于一个工程而言,该类对象就相当于是一个数据库,所以再工程中只使用一个对象即可
//连接成功,返回一个数据库对象
    db=QSqlDatabase::addDatabase("QSQLITE");//告诉系统,连接的数据库是sqlite3数据库

    db.setDatabaseName("test.db");//数据库文件后缀为.db

    //如果想要进一步操作数据库,那么,就必须要进行数据库打开操作

    if(!db.open())
    {
        qDebug()<<"Error falied to open"<<db.lastError();
    }

4. QSqlQuery 操作主要接口

方法描述
bindValue(int pos, const QVariant &val)绑定参数到查询中的指定位置。
boundValue(int pos)返回查询中指定位置的绑定参数值。
exec()执行当前设置的查询。
exec(const QString &query)执行指定的 SQL 查询语句。
setForwardOnly(bool forward)设置查询是否只能向前滚动。
first()移动到查询结果的第一条记录。
last()移动到查询结果的最后一条记录。
next()移动到查询结果的下一条记录。
previous()移动到查询结果的上一条记录。
seek(int index, bool relative)移动到查询结果中的指定位置。
value(int index)返回当前记录中指定字段的值。
record()返回当前记录的字段值。
nextResult()移动到多结果查询的下一个结果。
finish()完成多结果查询。
isActive()检查查询是否处于活动状态。
isValid()检查查询是否有效。
isSelect()检查查询是否为 SELECT 查询。
isForwardOnly()检查查询是否只能向前滚动。
lastError()返回最后一个查询操作的错误信息。
  • 范例示范
//连接成功,返回一个数据库对象
    db=QSqlDatabase::addDatabase("QSQLITE");//告诉系统,连接的数据库是sqlite3数据库

    db.setDatabaseName("test.db");//数据库文件后缀为.db

    //如果想要进一步操作数据库,那么,就必须要进行数据库打开操作

    if(!db.open())
    {
        qDebug()<<"Error falied to open"<<db.lastError();
    }


    //访问数据库的主要操作包括:创建表  向数据库表中插入数据  删除数据  更新数据  查询数据

    //对于数据库中的表,通常只需要创建一次,其他的操作可以重复
    QSqlQuery query;//在创建对象时,系统会自动完成跟数据库的关联

    //定义一条创建表的sql语句   表名:staff  表中的字段: id name age
    QString sqlCreate = QString("create table staff(id integer primary key autoincrement,"
                                "name varchar(20),"
                                "age int;");

    query.exec(sqlCreate);

5. 插入查询操作

  • 创建表
//连接成功,返回一个数据库对象
    db=QSqlDatabase::addDatabase("QSQLITE");//告诉系统,连接的数据库是sqlite3数据库

    db.setDatabaseName("test.db");//数据库文件后缀为.db

    //如果想要进一步操作数据库,那么,就必须要进行数据库打开操作

    if(!db.open())
    {
        qDebug()<<"Error falied to open"<<db.lastError();
    }


    //访问数据库的主要操作包括:创建表  向数据库表中插入数据  删除数据  更新数据  查询数据

    //对于数据库中的表,通常只需要创建一次,其他的操作可以重复
    //QSqlQuery query;//在创建对象时,系统会自动完成跟数据库的关联
#if 0
    //定义一条创建表的sql语句   表名:staff  表中的字段: id name age
    QString sqlCreate = QString("create table staff(id integer primary key autoincrement,"
                                "name varchar(20),"
                                "age int);");

    if(!query.exec(sqlCreate))
    {
        qDebug()<<"create table error"<<db.lastError();
    }
#endif
      QSqlQuery query;//在创建对象时,系统会自动完成跟数据库的关联
  • 插入操作
    //插入操作
    QString sqlInsert = QString ("INSERT INTO staff(id ,name,age) VALUES(2,'张三',20);");

    if(!query.exec(sqlInsert))
    {
        qDebug()<<"insert data error"<<db.lastError();
    }
  • 查询操作
    QString sqlSelect =QString ("select *from staff;");

    if(!query.exec(sqlSelect))
    {
        qDebug()<<"select data error"<<db.lastError();
    }else
    {
        while(query.next())
        {
           qDebug()<< query.value("id").toInt();
           qDebug()<< query.value("name").toString();
           qDebug()<< query.value("age").toInt();
        }
    }

6. 删除更新操作

  • 删除操作
//删除操作

    QSqlQuery query;

    QString sqlDelete = QString("delete from staff where id = 2;");

    if(!query.exec(sqlDelete))
    {
        qDebug()<<"delete data error"<<db.lastError();
    }
  • 更新操作
//更新数据操作
    QSqlQuery query;
    QString sqlUpdate = QString("update staff set name = '李四' where id =1;");
    if(!query.exec(sqlUpdate))
    {
        qDebug()<<"update data error"<<db.lastError();
    }

7.数据库和图形界面交互项目

  • 项目效果展示
    在这里插入图片描述
  • 增删改查功能
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QListWidgetItem>

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

    //1.根据数据库的类型来连接数据库
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("compary.db");

    //2.打开数据库

    if(!db.open())
    {
        qDebug()<<"open error"<<db.lastError();
    }

    //3.根据需求,创建数据库中所需要的表
    QSqlQuery query;
    /*
     员工表:staff
     字段名有 id name age adress salary
      */
    //autoincrement 自动增长

    //注释掉,这个创建表的操作只需要操作一次
#if 0
    QString sqlCreateTable = QString("create table staff(id integer primary key autoincrement,"
                                     "name varchar(20),"
                                     "age int,"
                                     "address varchar(50),"
                                     "salary int);");


    if(!query.exec(sqlCreateTable))
    {
        qDebug()<<"create table"<<db.lastError();
    }

#endif

#if 0
    QString sqlInsert = QString("insert into staff(name,age,address,salary) "
                                "values('张三',20,'广州市天河区',12000);");

    if(!query.exec(sqlInsert))
    {
        qDebug()<<"Error insert into data"<<db.lastError();
    }

#endif

}

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


void MainWindow::on_pushButton_add_clicked()
{
    //1.获取UI控件的内容
    //int id=ui->lineEdit_ID->text().toUInt();

    QString name=ui->lineEdit_name->text();

    QString address=ui->lineEdit_adress->text();

    int age=ui->lineEdit_age->text().toInt();

    int salary = ui->lineEdit_money->text().toInt();

    //2.执行sql语句将数据插入到数据中
    QSqlQuery query;

    QString sqlInsert=QString("insert into staff(name,age,address,salary)"
                              "values('%1',%2,'%3',%4);").arg(name)
                               .arg(age)
                               .arg(address)
                               .arg(salary);

    if(!query.exec(sqlInsert))
    {
       qDebug()<<"Error insert into data"<<db.lastError();
    }else
    {
        qDebug()<<"insert successful!!!";
    }



}

void MainWindow::on_pushButton_update_clicked()
{
    //更新数据库
    QSqlQuery query;
    int id=ui->lineEdit_ID->text().toInt();
    QString address=ui->lineEdit_adress->text();
    QString sqlUpdate=QString("update staff set address = '%1' where id=%2; " )
            .arg(address)
            .arg(id);


    if(!query.exec(sqlUpdate))
    {
        qDebug()<<"Error update into data"<<db.lastError();
    }else
    {
        qDebug()<<"update staff successful!!!";
    }
}

void MainWindow::on_pushButton_delete_clicked()
{
    //设置通过名字来删除
    QSqlQuery query;

    int id=ui->lineEdit_ID->text().toInt();

    QString sqlDelete=QString("delete from staff where id = %1;").arg(id);


    if(!query.exec(sqlDelete))
    {
        qDebug()<<"Error delete into data"<<db.lastError();
    }else
    {
        qDebug()<<"delete successful!!!";
    }


    //2.删除数据库的同时要删除UI控件上的内容,下标是从零开始的
    ui->listWidget->takeItem(id-1);

}

void MainWindow::on_pushButton_check_clicked()
{
    ui->listWidget->clear();
    //查询数据库的操作
    QSqlQuery query;

    //1.向数据库下达查询数据的命令
    QString sqlSelect=QString("select*from staff ;");

    if(!query.exec(sqlSelect))
    {
        qDebug()<<"Error select into data"<<db.lastError();
    }

    //2.遍历数据库的记录
    while(query.next())
    {
        int id = query.value("id").toInt();
        QString name = query.value("name").toString();
        int age = query.value("age").toInt();
        QString address = query.value("address").toString();
        QString salary = query.value("salary").toString();

        qDebug()<<"id = "<<id<<"name = "<<name<<"age = "<<age<<
                  "address = "<<address<<"salary = "<<salary;

        //3. 没遍历一条记录,就更新到ui控件上
        //3.1创建一个列表条目
        itemFrom*staffitem=new itemFrom();

        staffitem->setId(id);
        staffitem->setName(name);
        staffitem->setAge(age);
        staffitem->setAddress(address);
        staffitem->setSalary(salary);
        QListWidgetItem*item=new QListWidgetItem();

        //将大小设置相同
        item->setSizeHint(QSize(574,51));
        ui->listWidget->addItem(item);

        //QWidget(staffitem)放置在QListWidget中的一个项(item)中,而不是直接替换掉项。
        ui->listWidget->setItemWidget(item,staffitem);

    }


}
  • 自定义控件
    在这里插入图片描述
#include "itemfrom.h"
#include "ui_itemfrom.h"

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

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

void itemFrom::setId(int id)
{
    ui->lineEdit_ID->setText(QString::number(id));
}

void itemFrom::setName(QString name)
{
    ui->lineEdit_name->setText(name);
}

void itemFrom::setAge(int age)
{
    ui->lineEdit_age->setText(QString::number(age));
}

void itemFrom::setAddress(QString address)
{
    ui->lineEdit_address->setText(address);
}

void itemFrom::setSalary(QString salary)
{
    ui->lineEdit_money->setText(salary);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1947504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动驾驶系统开发与调试:车路云一体化无人驾驶挑战赛参赛体验

点击蓝字 关注我们 在过去的几年里&#xff0c;自动驾驶技术在全球范围内吸引了大量关注。其潜力不仅在于提升行车安全&#xff0c;而且还可以改变我们的出行方式和城市规划&#xff0c;提高交通运输效率。国际汽车工程师学会&#xff08;SAE&#xff09;根据不同自动驾驶程度&…

Linux中,MySQL数据库管理

使用MySQL数据库 查看数据库结构 MySQL是一套数据库管理系统&#xff0c;在每台MySQL服务器中&#xff0c;均支持运行多个数据库&#xff0c;每个数据库相当于一个容器&#xff0c;其中存放着许多表&#xff0c;如图2.1所示。 下面分别介绍查看数据库、表结构的相关操作语句。…

单片机原理及技术(四)—— C51语言程序设计基础(C51编程)

目录 一、C51语言中的数据类型与存储类型 1.1 数据类型 1.2 C51语言的扩展数据类型 1.3 数据存储类型 1.4 数据存储模式 二、C51语言的特殊寄存器及变量定义 2.1 特殊功能寄存器的C51语言定义 2.1.1 使用关键字定义sfr 2.1.2 使用头文件访问SFR 2.1.3 特殊功能寄存器…

《梦醒蝶飞:释放Excel函数与公式的力量》18.1 图表类型与设计

第18章&#xff1a;创建图表和数据可视化 18.1 图表类型与设计 Excel提供了多种图表类型&#xff0c;帮助用户以直观的方式展示数据。选择合适的图表类型和设计可以显著提高数据的可读性和理解度。以下将介绍常见的图表类型及其应用&#xff0c;并通过具体案例进行说明。 18.…

无人机制造工艺流程详解

一、需求分析 无人机制造的第一步是需求分析。这一阶段主要明确无人机的使用场景、功能要求、性能指标以及成本预算等。通过与客户或项目团队的深入沟通&#xff0c;确保对无人机的需求有全面而准确的理解。同时&#xff0c;也需要进行市场调研&#xff0c;了解同类型产品的特…

达梦数据库系列—31. 事务和锁

目录 事务 事务的状态 事务的四种隔离级别ACID 锁 锁粒度 锁等待与死锁 锁查看 锁处理 事务 数据库事务是指作为单个逻辑工作单元的一系列操作的集合。 事务的状态 NOT_START 未启动 ACTIVE 活动 LOCK_WAIT 锁等待 TRX4_PRE_COMMIT 预提交 事务ID(事务号)&…

llamaindex+Internlm2 RAG实践

llamaindexInternlm2 RAG实践 环境、模型准备 进入开发机后&#xff0c;从官方环境复制运行 InternLM 的基础环境&#xff0c;命名为 llamaindex&#xff0c;在命令行模式下运行&#xff1a; conda create -n llamaindex python3.10运行 conda 命令&#xff0c;激活 llamain…

IP地址专用SSL证书申请指南——六步完成

IP地址SSL证书是一种专门设计用于IP地址的SSL/TLS证书&#xff0c;部署IP地址SSL证书可以实现IP地址HTTPS加密。 一&#xff1a;前提条件 1&#xff1b;申请IP地址SSL证书,必须拥有这个IP地址的管理权限 2&#xff1b;非内网IP&#xff0c;以下是常见的内网IP字段 10.0.0.0…

Mindspore框架循环神经网络RNN模型实现情感分类|(三)RNN模型构建

Mindspore框架循环神经网络RNN模型实现情感分类 Mindspore框架循环神经网络RNN模型实现情感分类|&#xff08;一&#xff09;IMDB影评数据集准备 Mindspore框架循环神经网络RNN模型实现情感分类|&#xff08;二&#xff09;预训练词向量 Mindspore框架循环神经网络RNN模型实现…

松下UV电源MID SONIC600 ANUP8304NAIS电源设备更新换下的

松下UV电源MID SONIC600 ANUP8304NAIS电源设备更新换下的

JL 跳转指令的理解

一般情况下&#xff0c;JU 和 JC 是最常见的跳转指令&#xff1b;但有时会用到JL 指令&#xff0c;JL 说起来更像是一组指令&#xff0c;类似C,C# 语言中的 switch case 语句&#xff0c;但是有个明显的不同&#xff0c;前者的判断条件可以是任意合理数字&#xff0c;后者范围…

洗地机什么品牌质量好耐用?口碑最好的洗地机排名分享

在追求高效、便捷的现代家居环境中&#xff0c;洗地机作为清洁工具的关键角色&#xff0c;其品牌与品质的选择成为了消费者关注的焦点。面对琳琅满目的洗地机市场&#xff0c;洗地机什么品牌质量好耐用&#xff1f;如何挑选出一款既高效又智能&#xff0c;且能带来卓越清洁体验…

算力共享:环形结构的算力分配策略

目录 算力共享:环形结构的算力分配策略 方法签名 方法实现 注意事项 nodes.sort(key=lambda x: (x[1].memory, x[0]), reverse=True) end = round(start + (node[1].memory / total_memory), 5) 算力共享:环形结构的算力分配策略 这段代码定义了一个名为RingMemoryWeig…

基于 HTML+ECharts 实现智慧运维数据可视化大屏(含源码)

智慧运维数据可视化大屏&#xff1a;基于 HTML 和 ECharts 的实现 在现代企业中&#xff0c;运维管理是确保系统稳定运行的关键环节。随着数据量的激增&#xff0c;如何高效地监控和分析运维数据成为了一个重要课题。本文将介绍如何利用 HTML 和 ECharts 实现一个智慧运维数据可…

菜鸟从0学微服务——MyBatis-Plus

关于“菜鸟从0学微服务” 针对有编程基础&#xff0c;开始学习微服务的同学&#xff0c;我们陆续推出从0学微服务的笔记分享。力求从各个中间件的使用来反思这些中间件的作用和优势。 会分享的比较快&#xff0c;会记录demo演算和中间件的使用过程&#xff0c;至于细节的理论…

Python的人脸识别程序

1.录入人脸&#xff0c;输入ID号 haarcascade_frontalface_default.xml # 导入模块 import os import numpy as np import cv2 as cv import cv2face_detector cv2.CascadeClassifier(rD:\Automation_All_Files\OCR\haarcascade_frontalface_default.xml) # 待更改# 为即将…

【VTKExamples::Movie】制作并保存动画

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK中创建动画,并保存动画的方法,样例及样例源码,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ…

vue-快速入门

Vue 前端体系、前后端分离 1、概述 1.1、简介 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;可以高效地开发用户界面。…

vue3实现在新标签中打开指定的网址

有一个文件列表&#xff0c;如下图&#xff1a; 我希望点击查看按钮的时候&#xff0c;能够在新的标签页面打开这个文件的地址进行预览&#xff0c;该如何实现呢&#xff1f; 比如&#xff1a; 实际上要实现这个并不难&#xff0c;参考demo如下&#xff1a; 首先&#x…

【Go系列】Go的UI框架GIO

其实主要我是要花一个折线图&#xff0c;但是使用Fyne貌似画不出来&#xff0c;使用plot也没法动态生成&#xff0c;听说Gio可以&#xff0c;那就先介绍一下什么是Gio把。 GIO&#xff08;gioui.org&#xff09;是一个用于Go语言的跨平台GUI库&#xff0c;旨在为开发人员提供构…