Qt-sqlite3数据库编程实例

2023-10-31

Qt-sqlite3数据库编程实例


版本说明

版本 作者 日期 备注
0.1 loon 2018.10.26 初稿

目录

一、需求和目的

之前总结过Qt的数据库编程,知道如何取进行Qt已有的类进行数据库编程,并且由于其默认支持sqlite,因此,这里就写个例子来用一下我们所学到的内容。

之前看到的Qt自带示例是书籍管理的,所以我们下面做个学生成绩查看。

二、程序设计

简化程序,数据库不进行严格设计,数据库表格只设计一张:姓名、学号、年龄、英语成绩、数学成绩、语文成绩、总成绩组成scores表。做一个简单的登录对话框,设计一个登录按钮,点击登录后进入scoreWindow,显示对应的成绩和学员信息。

仿照books的架构,我们将整个程序分为两大块:scoreWindow类、initdb,和books的功能相似,只是增加一个登录对话框,而对于table的重写暂时取消掉,主要是熟悉一下使用Qt进行数据库编程的流程。

这里我们不使用内存形式,使用文件形式展示sqlite3数据库中的数据。

三、源码展示

initdb.h:

#ifndef INITDB_H
#define INITDB_H

#include <QtSql>

void addScore(QSqlQuery &q, const QString &name, int num, int age, int english, int math, int chinese)
{
    q.addBindValue(name);
    q.addBindValue(num);
    q.addBindValue(age);
    q.addBindValue(english);
    q.addBindValue(math);
    q.addBindValue(chinese);
    int total = math + english + chinese;
    q.addBindValue(total);
    q.exec();
}

QSqlError initDb()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
//    db.setDatabaseName(":memory:");
    db.setDatabaseName("./test.db");
    
    if(!db.open())
        return db.lastError();
    
    QStringList tables = db.tables();
    if(tables.contains("scores", Qt::CaseInsensitive))
        return QSqlError();
    
    QSqlQuery q;
    if(!q.exec(QLatin1String("create table scores(id int primary key, name varchar, num int, age int,\
    english int, math int, chinese int, total int)")))
        return q.lastError();
    
    if(!q.prepare(QLatin1String("insert into scores(name, num, age, english, math, chinese, total) \
    values (?,?,?,?,?,?,?)")))
        return q.lastError();
    addScore(q, QLatin1String("james"), 1, 20, 80, 80, 80);
    addScore(q, QLatin1String("jack"), 2, 20, 90, 90, 90);
    addScore(q, QLatin1String("jim"), 3, 20, 100, 100, 100);
                                
    return QSqlError();
}

#endif // INITDB_H

scorewindow.cpp

#include "scorewindow.h"
#include "ui_scorewindow.h"
#include "initdb.h"

#include <QtSql>
#include <QMessageBox>

scoreWindow::scoreWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::scoreWindow)
{
    ui->setupUi(this);
    
    //judge is include sqlite driver
    if(!QSqlDatabase::drivers().contains("QSQLITE"))
        QMessageBox::critical(this, "Unable to load database", 
                              "This pro needs the SQLITE driver");

    //initialize the database
    QSqlError err = initDb();
    if(err.type() != QSqlError::NoError) {
        showError(err);
        return;
    }
    
    //create the data model
    model = new QSqlRelationalTableModel(ui->scoreTable);
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->setTable("scores");
    
    //remeber the indexes of the columns
    num = model->fieldIndex("num");
    
    //set the ralations to the other database tables
    model->setHeaderData(model->fieldIndex("name"), Qt::Horizontal, tr("姓名"));
    model->setHeaderData(model->fieldIndex("age"), Qt::Horizontal, tr("年龄"));
    model->setHeaderData(num, Qt::Horizontal, tr("学号"));
    model->setHeaderData(model->fieldIndex("math"), Qt::Horizontal, tr("数学成绩"));
    model->setHeaderData(model->fieldIndex("english"), Qt::Horizontal, tr("英语成绩"));
    model->setHeaderData(model->fieldIndex("chinese"), Qt::Horizontal, tr("语文成绩"));
    model->setHeaderData(model->fieldIndex("total"), Qt::Horizontal, tr("总成绩"));
    
    //Populate the model
    if(!model->select()) {
        showError(model->lastError());
        return;
    }
    
    //Set the model and hide the ID colum
    ui->scoreTable->setModel(model);
    ui->scoreTable->setColumnHidden(model->fieldIndex("id"), true);
    ui->scoreTable->setSelectionMode(QAbstractItemView::SingleSelection);
}

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

void scoreWindow::showError(const QSqlError &err)
{
    QMessageBox::critical(this, "Unable to init Database", "Error init database:"+ err.text());
}

scorewindow.h:

#ifndef SCOREWINDOW_H
#define SCOREWINDOW_H

#include <QMainWindow>
#include <QtSql>

namespace Ui {
class scoreWindow;
}

class scoreWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit scoreWindow(QWidget *parent = 0);
    ~scoreWindow();
    
private:
    Ui::scoreWindow *ui;
    void showError(const QSqlError &err);
    QSqlRelationalTableModel *model;
    int num;
};

#endif // SCOREWINDOW_H

ui文件都是最基本的,没有进行复杂的处理。

四、结果展示

点击登录,直接显示表格信息。

在这里插入图片描述

然后我们发现在工程文件夹下有一个test.db文件,这个就是我们的数据库文件,我们用专门的sqlite文件数据库查看软件直接打开该文件就可以看到数据库表格信息,我这里使用的是SQlite Database Browser2.0b1:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

五、最后

之所以仿照books的设计方式是因为其设计方式更符合软件设计模式,这就像乐高积木,其每个积木的设计都符合一定的模式和规则,这样更方便组合成不同的形状,组合成不同的内容。

本次总结主要是熟悉Qt数据库编程流程,要灵活的运用可能还需要掌握其它的积木。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt-sqlite3数据库编程实例 的相关文章

  • 聊聊Qt中的Widget调色板QPalette

    在实际的应用开发中 经常需要对某个窗体或某个控件的颜色外观 如背景色 前景色等进行设置 已达到界面美化的效果 Qt中的窗体或控件都是Widget类 Qt中提供的调色板QPalette类就是专门用于管理控件的外观显示 QPalette类相当于
  • Qt操作excel的三方库Qtxlsx在Windows下使用注意事项

    Qt操作excel的三方库Qtxlsx在Windows下使用注意事项 文章目录 Qt操作excel的三方库Qtxlsx在Windows下使用注意事项 1 Qt Xlsx简介 2 编译及添加模块 2 1 下载及编译 2 2 拷贝相关文件集成到
  • OpenCV人脸检测及识别(深度学习)

    简介 最近做了一个人脸检测以及识别的程序 很多的文章都有比较详细的叙述 可以自行查找 但是个人觉得大部分文章都太细致了以至于初学者无法快速领会主干 不是否认质量 是侧重点问题 所以结合我遇到了一些问题 现在做个总结 本文主要叙述实现的思路
  • QT学习 之 QwtPlot(数学绘图)

    QT对于统计图像 函数图像等的绘制是没有相关组件的帮助的 只有利用手工绘制图片 QwtPlot是用来绘制二维图像的widget 继承自QFrame 和 QwtPlotDict 不过严格的说来 它只是一个视图窗口 真正的绘制设备是它的中心部件
  • Qt数据库编程

    Qt数据库编程 版本说明 版本 作者 日期 备注 0 1 loon 2018 10 25 初稿 目录 文章目录 Qt数据库编程 版本说明 目录 一 需求和目的 二 使用说明 1 Qt 5 6 0的数据库操作类 2 Driver Layer
  • Qt中实现单击button按钮发送单击信号,触发searchitem(QModelIndezparent,qsringtxt)槽函数,搜索后设置选中状态并设置背景色为红色。

    首先 我们依旧需要先创建一个 QPushButton 按钮 并且还需要创建一个槽函数 searchitem QModelIndex parent QString txt 来接收其发射的信号 接下来 在槽函数 searchitem 中 我们需
  • Qt的MOC机制

    Qt的MOC机制 Qt扩展了C 使得开发者拥有很多方便使用的工具 如何使用Qt提供的特性呢 比如信号与槽 那就需要开发者在类中声明Q OBJECT宏 这样程序员就能使用Qt提供的功能了 为什么这样可以呢 先从C 文件的编译过程开始讲 一般C
  • 自定义信号槽机制

    自定义信号槽机制 自定义信号 自定义槽 自定义信号和槽函数的使用 解决办法 如果想要在QT类中自定义信号槽 需要满足一些条件 并且有些事项也需要注意 要编写新的类并且让其继承Qt的某些标准类 这个新的子类必须从QObject类或者是QObj
  • QFileDialog 对话框类

    QFileDialog 对话框类 QFileDialog 对话框类是 QDialog 类的子类 通过这个类可以选择要打开 保存的文件或者目录 关于这个类我们只需要掌握一些静态方法的使用就可以了 通用参数 parent 当前对话框窗口的父对象
  • VS 静态库lib如何依赖动态库dll

    一般来说 vs可以提供正常的依赖输入窗口用于依赖动态库 但是当工程设置生成静态库之后 VS默认不支持给静态库增加依赖动态库 链接器选项没有了 此时只能够把静态库所依赖的动态库也改成静态库 这样这个静态库才能被正常编译 否则编译的时候会报错
  • QT容器详解

    QString类 隐式共享 隐式数据共享机制去最大化资源有效利用和最小化复制克隆操作 隐式数据共享类当作为函数参数传递的时候 不仅安全而且效率很高 因为传递的时候只是传递了数据的指针 数据本身只当自己被修改的时候才会去复制 简称写时复制 数
  • QTcpSocket 发送数据心得

    遇到不会用的函数前 最好还是看看手册QAQ 今天居然吃了这个大亏 先交代一下背景 在做TCP客户端的发送数据功能 要和服务器程序进行TCP IP通信 且根据通信协议要发送数组或者结构体 并且数组的每一个位都是有效数据位 因此不能像大多数人一
  • Qt中的私有信号

    一 什么是Qt私有信号 直接引用Qt文档中的描述 二 私有信号的作用 私有信号只能被响应 不能被用户代码来发射 emit 这是一种对某些信号的权限控制 也就是用户代码没有权力 发号施令 只能由Qt的类来发射 防止信号被 仿造 三 是否可以用
  • error: static assertion failed: Type is not registered, please use the Q_DECLARE_METATYPE macro to m

    error static assertion failed Type is not registered please use the Q DECLARE METATYPE macro to m 解决方案 报错信息如下 调用了类的静态函数导
  • Qt常用数据类型

    常用数据类型 1 常用基本数据类型 常用接口 求绝对值 T是泛型 以下都是 T qAbs const T t 最大值和最小值 会把最大或最小的返回出来 T qMax const T value1 const T value2 T qMin
  • 嵌入式开发之移植MQTT到RK3568

    目录 前言 一 下载qmqtt源码 二 编译库文件 三 移植到RK3568 3 1 移植动态库libQt5Qmqtt 四 联机测试 4 1 制作demo 4 1 1 创建demo新项目 4 1 2 添加network模块支持 4 1 3 添
  • QT进程间通信 详细介绍

    在QT中 信号和槽的机制取代了这种繁杂的 易崩溃的对象通信机制 信号是当对象状态改变时所发出的 槽是用来接收发射的信号并响应相应事件的类的成员函数 信号和槽的连接是通过connect 函数来实现的 AD 1 QT通信机制 为了更好的实现QT
  • Qt核心特性之 —— 「信号(Signal)与槽(Slot)」机制

    目录 1 Qt 与 Qt Creator简介 2 关于引用头文件的一些事儿 3 信号 Signal 与槽 Slot 机制 3 1 一个小例子 4 自定义信号与槽 4 1 运行效果 5 信号与槽的特性 6 Qt 4 版本以前 connect
  • Qt之自定义布局管理器(QBorderLayout)

    简述 QBorderLayout 顾名思义 边框布局 实现了排列子控件包围中央区域的布局 具体实现要求不再赘述 请参考前几节内容 简述 实现效果源码 使用 实现 QBorderLayout主要采用QLayout和QWidgetItem实现
  • 嵌入式开发、C++后端开发、C++音视频开发怎么选择?

    嵌入式开发 C 后端开发和C 音视频开发的选择问题 近年来 随着互联网和物联网的快速发展 嵌入式开发 C 后端开发和C 音视频开发等职业领域也逐渐受到广泛关注 对于有志于从事这些领域的人来说 如何做出选择呢 下面将从前景 薪酬和职业稳定性等

随机推荐

  • 全网最火Java面试题

    第一部分 JAVA 基础 第一节 IO NIO 第二节 反射 第三节 多线程 第四节 集合 第五节 Web 第六节 其他 第七节 关键字 第八节 操作符 第九节 基础类型 第十节 异常 第十一节 JDBC 第十二节 OOP 第二部分 JVM
  • 深入理解Qt4/Qt5信号和槽机制

    对于事件处理 MFC中使用的是消息映射机制 Qt使用的是信号和槽机制 在我看来 Qt的信号和槽比MFC功能更强大 也更灵活 1 信号和槽的简单介绍 一般格式 connect Sender SIGNAL signal Receiver SLO
  • C++派生类的不同继承方式对基类的访问权限

    经过我细心的整理 形成了这张表 一张表说明派生类的不同继承方式 对基类的访问权限 总的来说 对类的访问权限范围public
  • 2022 CISCN初赛 Satool

    一个2022年国赛初赛的LLVM PASS类pwn题 当时还完全没有接触过 所以直接放弃掉了 初赛结束之后决定入门一下这方面知识 看这篇题解之前最好先看看之前写的这篇入门文章 LLVM PASS类pwn题入门 然后我们正式开始这道题 首先从
  • 07-js 逆向-返回数据加密(aes)

    目标 返回的结果有加密 把结果解密 可以看到返回来的data是加密的 但是加密的数据并没有进行混淆 这时候我们可以采用直接搜解密 decrypt 直接发先我们的数据书通过aes加密的 我们开始些python代码 from Crypto Ci
  • vndk: (native:vendor) should not link to libcamera_client (native:platform)

    1 0 相似例子 2 21 17 47 30 305 4365 4365 E CamX ERROR UTILS camxosutilslinux cpp 874 LibMap dlopen dlopen failed library lib
  • 利用mimikatz查看rdp连接密码【渗透测试】

    0x00 概述 在使用 rdp 时会发现系统有保存连接密码的功能 一定在本地以一种加密方式保存 在连接的时候解密进行rdp尝试 那么我们能不能那到加密的密码解密以获取这台机器rdp连接过的机器呢 0x01 流程 AppData Local
  • PUMA:DOA估计模式的改进实现(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码实现 4 参考文献 1 概述 文献来源 下载链接 PUMA An Imp
  • ue4添加第三方库

    查了一些资料 发现最后都是用loadlibrary的方式 这样很不方便 如果有10000个函数 要写10000次么 仔细想想 调用第三方库无非就是把头文件和lib库设置下 把相应的 h lib和 dll放到相应的位置 再在调用的地方包含头文
  • cadence原理图封装pin名称重复_Cadence原理图库文件引脚名重复处理方法介绍

    立题简介 内容 Cadence原理图库文件引脚名重复处理方法 来源 实际使用得出 作用 介绍2种处理Cadence原理图库文件引脚名的方法 PCB环境 Cadence 16 6 orCAD环境 日期 2019 03 09 分割线 立题详解
  • spring打印http接口请求和响应

    在程序日志中打印出接口请求和响应的内容是一个基本的技术需求 如果在每个接口中实现请求响应的日志打印 程序编写会很繁琐 我们可以利用spring提供的机制 集中处理接口请求响应的日志打印 具体的代码参照 示例项目 https github c
  • 使用ipmitool命令检测电源模块状态

    1 通过ipmitool检查电源模块状态 https mp weixin qq com s Z1g79Q1aMhOT9Xm9fvIkjg 2 通过ipmitool获取服务器各元件温度信息 https mp weixin qq com s E
  • 大数据分布式计算开源框架Hadoop的介绍和运用

    Hadoop是Apache开源组织的一个分布式计算开源框架 在很多大型网站上都已经得到了应用 如亚马逊 Facebook和Yahoo等等 对于我来说 最近的一个使用点就是服务集成平台的日志分析 服务集成平台的日志量将会很大 而这也正好符合了
  • vue 快速自定义分页el-pagination

    vue 快速自定义分页el pagination template div style text align center div
  • main函数中的参数代表的意义

    int main int argc char argv 或者是 int main int argc char argv 里面的参数是什么意义呢 argc 是 argument count的缩写 表示传入main函数的参数个数 argv 是
  • 分享一个完整的Mybatis分页解决方案

    原文地址 http duanhengbin iteye com blog 1998017 参考地址 http blog csdn net isea533 article details 23831273 Mybatis 的物理分页是应用中的
  • 一起学ORBSLAM2(11)ORBSLAM的localmapping

    转载请注明原创地址 https blog csdn net qq 30356613 article category 6897125 ORBSLAM的局部建图线程实际做的工作是来维护全局map以及管理关键帧的 对tracking得到的关键帧
  • HWND转成CWnd

    在Dialog调用中调用系统的Create函数时 遇到了这个问题 BOOL CWnd Create LPCTSTR lpszClassName LPCTSTR lpszWindowName DWORD dwStyle const RECT
  • java设计模式--[结构模式]--装饰者模式[decorator pattern]

    一 裝飾者模式 裝飾者模式 又叫包裝器 動態地給動象添加一些額外的職責 若要擴展功能 裝飾者指供了比繼承更有彈性的替代方案 二 裝飾者模式的UML類圖如下 三 本節內容以一個點餐配菜的案例來說明裝飾者模式的用法 完整代碼如下 1 主食類超類
  • Qt-sqlite3数据库编程实例

    Qt sqlite3数据库编程实例 版本说明 版本 作者 日期 备注 0 1 loon 2018 10 26 初稿 目录 文章目录 Qt sqlite3数据库编程实例 版本说明 目录 一 需求和目的 二 程序设计 三 源码展示 四 结果展示