Qt-数据库开发-QTableView操作数据库(1)

news2024/12/23 2:03:34

Qt-数据库开发-QTableView操作数据库

文章目录

  • Qt-数据库开发-QTableView操作数据库
    • 1、概述
    • 2、实现效果
    • 3、主要代码
    • 4、完整源代码

更多精彩内容
👉个人内容分类汇总 👈
👉数据库开发 👈

1、概述

  • 这是通过学习Qt官方Demo产生的一个示例;
  • 通过自己理解加入了一些更加详细便于学习的内容;
  • 添加了非常详细的注释信息,对于小白更加友好。

开发环境说明

  • 系统:Windows10、Ubuntu20.04
  • Qt版本:V5.12.5
  • 编译器:MSVC2017-64、GCC/G++64

2、实现效果

  1. 这个Demo中展示了如何使用具有表视图的专用 SQL 表模型(QSqlTableModel)来编辑数据库中的信息,使用QTableView显示和编辑;
  2. 程序启动时自动创建一个数据库,并创建一个表写入默认测试数据,可选择创建文件数据库还是内存数据库;
  3. 写入测试数据时演示了QSqlQuery的五种不同的插入数据方式;
  4. 只有一个main.cpp,十分简单便于学习。
  • 实现效果如下:

    在这里插入图片描述

3、主要代码

  • 啥也不说了,直接上代码,一切有注释

  • pro文件: Qt使用到数据库,上来什么都别管,先在pro文件添加上QT += sql widgets

  • main.cpp文件:程序第一次启动时在main函数中创建数据库并写入数据,并通过QTableView显示数据库内容;

    #include <QApplication>
    #include <QDebug>
    #include <QMessageBox>
    #include <QSqlDatabase>
    #include <QSqlQuery>
    #include <QSqlTableModel>
    #include <QTableView>
    
    /**
     * @brief  创建并打开一个QSqlite数据库,并创建一个测试表person,同时默认创建5组数据
     * @return
     */
    bool createConnection()
    {
        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");  // 使用数据库驱动(Qsqlite)和默认连接名称(qt_sql_default_connection)添加一个数据库
    //    qDebug() << QSqlDatabase::defaultConnection;           // 打印默认数据库连接名称
    #if 1
        db.setDatabaseName("test.db");        // 使用文件数据库(可生成数据库文件,数据一直有效)
    #else
        db.setDatabaseName(":memory:");       // 使用内存数据库(不会生成数据库文件,所有数据都在内存中进行操作,性能强,程序退出后数据丢失)
    #endif
    
        if(!db.open())             // 打开数据库
        {
            QMessageBox::critical(nullptr, "Error", "打开数据库失败!");
            return false;
        }
    
        QSqlQuery query;          // 创建一个用于执行和操作Sql语句的对象
    
        // 创建一个表person,包含id、firstname、lastname三个字段
        query.exec("create table person ("
                   "id         int primary  key,"    // 索引
                   "firstname  varchar(20),"         // 名
                   "lastname   varchar(20))");       // 姓
    
        /****************** 向表中插入数据 ************************/
    
        // 插入方式一:直接插入数据
        query.exec("insert into person values(1, '悟空', '孙')");       // INSERT INTO 语法1(为表中所有项插入数据)
    
        // 插入方式二:使用命名占位符的[命名]绑定
        query.prepare("insert into person(id, firstname, lastname)"       // insert into 语法2
                      "values (:id, :firstname, :lastname)");
        query.bindValue(":id", 2);
        query.bindValue(":firstname", "悟净");
        query.bindValue(":lastname", "沙");
        query.exec();
    
        // 插入方式三:使用命名占位符的[位置]绑定
        query.prepare("insert into person(id, firstname, lastname)"       // insert into 语法2
                      "values (:id, :firstname, :lastname)");
        query.bindValue(0, 3);
        query.bindValue(1, "八戒");
        query.bindValue(2, "猪");
        query.exec();
    
        // 插入方式四:使用位置占位符绑定值(版本 1)
        query.prepare("insert into person(id, firstname, lastname)"       // insert into 语法2
                      "values (?, ?, ?)");
        query.bindValue(0, 4);
        query.bindValue(1, "白龙");
        query.bindValue(2, "小");
        query.exec();
    
        // 插入方式五:使用位置占位符绑定值(版本 2)
        query.prepare("insert into person(id, firstname, lastname)"       // insert into 语法2
                      "values (?, ?, ?)");
        query.addBindValue(5);                                           // 使用位置值绑定时,将值val添加到值列表中。addBindValue()调用的顺序决定了在准备好的查询中将值绑定到哪个占位符
        query.addBindValue("三藏");
        query.addBindValue("唐");
        query.exec();
    
        return true;
    }
    
    /**
     * @brief        初始化用于操作显示数据库的Model
     * @param model  QSqlTableModel是一个高级接口,用于从单个表读取和写入数据库记录。
     *               它构建在较低级别的QSqlQuery之上,可用于提供数据以查看类,如QTableView
     */
    void initModel(QSqlTableModel* model)
    {
        model->setTable("person");                                // 设置需要显示的数据库表
    #if 1
        model->setEditStrategy(QSqlTableModel::OnFieldChange);    // 在界面上修改后数据立刻保存到数据库
    #else
        model->setEditStrategy(QSqlTableModel::OnManualSubmit);   // 将将编辑数据库中值的策略设置为[在调用 submitAll() 或 revertAll() 之前,所有更改都将缓存在模型中(即在界面上修改数据后不会立刻存入数据库)]
    #endif
        model->select();                                         // 获取数据库中的数据
        model->setHeaderData(0, Qt::Horizontal, "ID");
        model->setHeaderData(1, Qt::Horizontal, "名称");
        model->setHeaderData(2, Qt::Horizontal, "姓氏");
    }
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        if(!createConnection()) return -1;
    
        QSqlTableModel model;                                   // 创建一个 单个数据库表的可编辑数据模型
        initModel(&model);
    
        QTableView *view = new QTableView;                      // 创建一个用于显示表的视图实现(由于是基于QWidget的,所以可以直接显示)
        view->resize(400, 300);                                 // 设置窗口大小
        view->setWindowTitle("");
        view->setWindowTitle(QString("QSql-使用QSqlTableModel显示数据库内容Demo1 - V%1").arg(APP_VERSION));
        view->setModel(&model);                                 // 设置需要显示的表model
        view->show();
    
        return a.exec();
    }
    
    

4、完整源代码

  • github
  • gitee

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

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

相关文章

【爬虫5年保更新专栏】异步协程典型案例,一篇掌握~

最近收到 C 友反馈&#xff0c;说 《听说过 python 协程没&#xff1f;听说过 asyncio 库没&#xff1f;都在这一篇博客了》 这篇博客的目标图片站&#xff0c;已经不能使用了&#xff0c;橡皮擦查阅之后&#xff0c;发现是对方网站已经不运营了&#xff0c;所以更新一下案例。…

SessionJSPCookie

今日内容 会话技术。会话技术包括两个&#xff1a; CookieSession JSP的入门学习&#xff1a;JSP也是一种服务器的动态资源&#xff0c;servlet也是一种服务器的动态资源。 会话技术 会话&#xff1a;一次会话中包含多次请求和响应。一次会话就像是人与人的一次见面聊天&…

Maya多边形物体批量材质传递工具v1.0发布及教程

一、插件介绍&#xff1a; 在大量场景制作时&#xff0c;当前期模型和材质没有同时完成&#xff0c;而用白模进行场景搭建后&#xff0c;能否后期&#xff0c;快速根据相同模型结构&#xff0c;快速识别物体并批量赋材质吗&#xff1f;答案是现在可以了。下面介绍的就是解决此…

使用SBT构建和发布基于SpringBoot的Scala应用

SBT 是 Scala 生态圈里的经典构建工具&#xff0c;虽然很多人觉得 SBT 很复杂&#xff0c;还戏称其为 SB Tool&#xff0c;但其全称确是 Simple Build Tool。 实际上&#xff0c;很多产品&#xff08;包括像 SBT 这样的工具和技术产品&#xff09;只有一个打动用户的特性就够了…

面经攻略:详谈Redis常见数据类型

&#x1f449;本篇速览 早在最开始学Redis的时候&#xff0c;我们就学到了这九种数据类型&#xff1a;String、Hash、List、Set、Zset、BitMap、HyperLogLog、GEO、Stream&#xff0c;但其实在学的时候并不了解它的底层是怎么存储这些数据&#xff0c;而不同的数据类型又有哪些…

深兰科技|党政干部科技学习权威读本《元宇宙与社会治理新范式》

近日&#xff0c;由中共中央党校出版社出版&#xff0c;深兰科技创始人、深兰科技科学院创始院长陈海波撰写的《元宇宙与社会治理新范式》一书正式发售。 该书与陈海波主编的《与领导干部谈AI——人工智能推动第四次工业革命》、《与领导干部谈量子科技》一同入选了中共中央党校…

Web3中文|微软:黑客通过Telegram侵害加密公司

微软最近调查了一次攻击&#xff0c;在该攻击中&#xff0c;被追踪为 DEV-0139 的威胁参与者通过加入加密货币交易平台的Telegram群来寻找目标用户。 10月19日&#xff0c;威胁参与者冒充加密资产管理公司的代表邀请目标用户到另一个Telegram群&#xff0c;在那里威胁参与者要…

osgEarth示例分析——osgearth_eci

前言 osgearth_eci示例&#xff0c;展示了J2000的天体坐标系和ECEF地固系的转换&#xff0c;绘制坐标系&#xff0c;以及读取卫星参数绘制卫星的功能。绘制卫星轨迹&#xff0c;添加差值效果和未添加差值的效果。 关于卫星两行根数的数据文件下载路径&#xff1a;CelesTrak: …

0基础怎么转行软件测试?

前言 0基础转行软件测试难吗&#xff1f;怎么学才能找到工作&#xff1f;这应该是所有新人都会面临的问题&#xff0c;所以我结合自己的经历&#xff0c;做了一些总结和学习方法&#xff0c;希望能对大家有所帮助。 我按照薪资的不同大致划分成3个档位&#xff1a; 月薪5-9k&…

高压直流输电(HVDC)的最优潮流(OPF)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

ZIP压缩包的自动设置密码可以这样解除

WinRAR设置了自动添加密码&#xff0c;每次压缩完ZIP文件后&#xff0c;都会自带打开密码&#xff0c;打开压缩包里的文件都需要输入密码。如果后续不需要每个ZIP文件都带有密码&#xff0c;要如何去除这个设置呢&#xff1f; 首先&#xff0c;打开WinRAR压缩软件&#xff0c;点…

晶品特装在科创板上市:总市值约为48亿元,前三季度收入下滑12%

12月8日&#xff0c;北京晶品特装科技股份有限公司&#xff08;下称“晶品特装”&#xff0c;SH:688084&#xff09;在上海证券交易所科创板上市。本次上市&#xff0c;晶品特装的发行价格为60.98元/股&#xff0c;发行数量为1900万股&#xff0c;募资总额约为11.59亿元&#x…

IncepFormer:用于语义分割的高效inception transformer

前言 语义分割通常得益于全局上下文、精细定位信息、多尺度特征等。为了在这些方面改进基于Transformer的分割器&#xff0c;本文提出了一种简单而强大的语义分割架构——IncepFormer。IncepFormer介绍了一种新颖的金字塔结构Transformer编码器&#xff0c;它同时获取全局上下文…

中药中天然类固醇—艾美捷胆固醇肉豆蔻酸酯

艾美捷胆固醇肉豆蔻酸酯相关参数说明&#xff1a; CAS Registry No.: 1989-52-2 Formal Name: (3β)-cholest-5-en-3-ol 3-tetradecanoate Synonyms: Cholesterol Myristate, Cholesteryl Tetradecanoate, Myristic Acid cholesteryl ester, NSC 226867 MF: C41H72O2 FW: …

[附源码]Python计算机毕业设计Django预约挂号app

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

密码学-1-数字签名体制

密码学-1-数字签名体制密码学-2-RSA签名验签方案写在前面 1 数字签名 1.1 什么是数字签名 1.2 数字签名的作用 1.3 数字签名的特性 1.4 数字签名的算法 2 数字签名的原理 2.1 签名过程&#xff1a;创建数字签名 2.2 验证过程&#xff1a;验证数字签名 写在前面 …

Matlab|模拟电动汽车的充放电【充电顺序,波动发电,电池缓冲】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

使用redis Zset根据score和时间从多个维度进行排序(Zset榜单多维度排序)

文章目录1. 分段bit位实现排序2. 除数实现排序&#xff08;推荐&#xff09;3. 基于分段bit为实现的redis排序工具类一般我们都会用redis的Zset这个数据结构来做排行榜 问题引入&#xff1a;使用zSet进行排序的时候一直有一个痛点&#xff0c;就是只能根据score进行排序&#x…

牛客算法刷题-BM6 判断链表中是否有环

描述 判断给定的链表中是否有环。如果有环则返回true&#xff0c;否则返回false。 数据范围&#xff1a;链表长度 0≤\leq≤ n ≤\leq≤ 10000&#xff0c;链表中任意节点的值满足 |val| ≤\leq≤ 100000。 要求&#xff1a;空间复杂度 O(1)&#xff0c;时间复杂度 O(n)。 输…

思科模拟器 | 静态路由和默认路由的配置

静态路由与默认路由一、静态路由1、自定义IP地址2、基本配置与接线3、接口配置与指令描述4、静态路由配置【⭐】5、主机测试连接二、默认路由1、基本命令配置2、测试连接一、静态路由 1、自定义IP地址 以下是我自己分配的主机和个接口的IP地址、子网掩码以及默认网关&#xf…