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

news/2024/11/27 12:44:42/

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 1db.setDatabaseName("test.db");        // 使用文件数据库(可生成数据库文件,数据一直有效)
    #elsedb.setDatabaseName(":memory:");       // 使用内存数据库(不会生成数据库文件,所有数据都在内存中进行操作,性能强,程序退出后数据丢失)
    #endifif(!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 1model->setEditStrategy(QSqlTableModel::OnFieldChange);    // 在界面上修改后数据立刻保存到数据库
    #elsemodel->setEditStrategy(QSqlTableModel::OnManualSubmit);   // 将将编辑数据库中值的策略设置为[在调用 submitAll() 或 revertAll() 之前,所有更改都将缓存在模型中(即在界面上修改数据后不会立刻存入数据库)]
    #endifmodel->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);                                 // 设置需要显示的表modelview->show();return a.exec();
    }

4、完整源代码

  • github
  • gitee

http://www.ppmy.cn/news/2657.html

相关文章

【Shell牛客刷题系列】SHELL22 处理文本

该系列是基于牛客Shell题库&#xff0c;针对具体题目进行查漏补缺&#xff0c;学习相应的命令。 刷题链接&#xff1a;牛客题霸-Shell篇。 该系列文章都放到专栏下&#xff0c;专栏链接为&#xff1a;《专栏&#xff1a;Shell》。欢迎关注专栏~ 本文知识预告&#xff1a; 本文…

C语言百日刷题第十三天

前言 今天是刷题第13天&#xff0c;放弃不难&#xff0c;但坚持一定很酷~ 临近期末&#xff0c;再刷一套模拟题 C语言百日刷题第十三天前言选择题判断题编程题选择题 1.若由定义int*p1,*p2,m5,n;以下赋值语句都正确的选项是&#xff08;&#xff09; A、p1&m;p2&n…

计算机毕业设计ssm+vue基本微信小程序的琴房管理系统 uniapp 小程序

项目介绍 随着互联网技术的发发展,计算机技术广泛应用在人们的生活中,逐渐成为日常工作、生活不可或缺的工具,钢琴培训企业各种管理系统层出不穷,为钢琴培训企业琴房管理开发必要的系统,能够有效的提升管理效率。一直以来,钢琴培训企业琴房预约一直没有进行系统化的管理,学生无…

pytorch基础操作(三)梯度下降(小批量)计算线性回归

1、线性模型 线性假设是指⽬标&#xff08;房屋价格&#xff09;可以表⽰为特征&#xff08;⾯积和房龄&#xff09;的加权和&#xff0c;如下⾯的式⼦&#xff1a; price warea area wage age b. 其中: warea和wage 称为权重&#xff08;weight&#xff09;&#xff0c;…

数据挖掘与机器学习课程总结

2022.11月 文章目录一、引言1.1 数据中的知识发现包括哪几个步骤&#xff1f;(Knowledge Discovery from Data, KDD)1.2 数据挖掘应用二、学习的可行性2.1 Hoeffding 不等式&#xff08;Hoeffding’s Inequality&#xff09;2.2 用 Hoeffding 不等式说明学习的可行性三、数据和…

Docker_简介、优势、架构、常用命令

Docker简介 Docker是什么 Docker就是将环境在不消耗大量资源的情况下复制出一个一样的环境 一次镜像&#xff0c;处处运行 内核级虚拟化 基于GO语言实现的开源项目 解决运行环境和配置问题的软件容器 容器与虚拟机比较 虚拟机是模拟的整套操作系统&#xff0c;会有资源占用…

IDEA 导入别人的javaweb项目进行部署

前言 我主要是进行java的springboot项目和vue项目的开发&#xff0c;但是架不住在这些框架兴起之前&#xff0c;公司内部已经是有其他的老的框架&#xff0c;我需要在这些老的框架进行修改和调整代码。原本我是使用的eclipse软件进行部署&#xff0c;也比较简单&#xff1b; …

HTML网页制作代码——简约的旅游图文相册博客HTML模板(12页)HTML+CSS+JavaScript 静态HTML旅行主题网页作业

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…