Qt-数据库开发-QDataWidgetMapper(5)

news2024/12/23 4:50:08

Qt-数据库开发-使用QDataWidgetMapper将数据库数据映射到小部件

文章目录

  • Qt-数据库开发-使用QDataWidgetMapper将数据库数据映射到小部件
    • 1、概述
    • 2、实现效果
    • 3、主要代码
    • 4、完整源代码

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

1、概述

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

开发环境说明

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

2、实现效果

  1. 本示例展示了如何使用QDataWidgetMapper将数据库数据映射到小部件QLineEdit、QTextEdit、QComboBox上;
  2. 程序启动时自动创建一个数据库,并创建一个主表、一个子表写入测试数据,可选择使用文件数据库还是内存数据库;
  3. 通过主表中的【外键】去关联子表中的数据;
  • 数据库内容如下:

    在这里插入图片描述

  • 实现效果如下:

    在这里插入图片描述

3、主要代码

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

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

  • widget.ui文件:

    在这里插入图片描述

  • widget.h文件

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class Widget; }
    class QSqlRelationalTableModel;
    class QItemSelectionModel;
    class QDataWidgetMapper;
    QT_END_NAMESPACE
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        Widget(QWidget *parent = nullptr);
        ~Widget();
    
    private:
        void setupModel();
    
    private slots:
        void updateButtons(int row);
    
    private:
        Ui::Widget *ui;
        QSqlRelationalTableModel* m_model = nullptr;
        QItemSelectionModel* m_selectionModel = nullptr;
        QDataWidgetMapper* m_mapper = nullptr;
        int m_index = 0;
    };
    #endif // WIDGET_H
    
    
  • widget.cpp文件

    #include "widget.h"
    #include "ui_widget.h"
    
    #include <QtSql/qsqldatabase.h>
    #include <QtSql/qsqlquery.h>
    #include <QtSql/qsqlrelationaldelegate.h>
    #include <QtSql/qsqlrelationaltablemodel.h>
    
    #include <QDataWidgetMapper>
    #include <qmessagebox.h>
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget)
    {
        ui->setupUi(this);
    
        this->setWindowTitle(QString("QSql-使用QDataWidgetMapper将数据库内容映射到控件上 - V%1").arg(APP_VERSION));
        setupModel();
    
        QSqlTableModel* relModel = m_model->relationModel(m_index);        // 返回一个用于访问列是外键的表
        ui->com_type->setModel(relModel);                                  // 将外键访问的列model传入下拉框
        ui->com_type->setModelColumn(relModel->fieldIndex("description")); // 设置需要显示model中哪一列
    
        m_mapper = new QDataWidgetMapper(this);   // 可用于将模型数据映射到小部件,每次当前索引发生变化时,每个小部件都会通过映射时指定的属性使用来自模型的数据进行更新。
        m_mapper->setModel(m_model);
        m_mapper->setItemDelegate(new QSqlRelationalDelegate(this)); // 与默认委托不同,QSqlRelationalDelegate 为其他表的外键字段提供了一个组合框
        m_mapper->addMapping(ui->line_name, m_model->fieldIndex("name"));        // 在小部件和模型中的节之间添加映射
        m_mapper->addMapping(ui->text_address, m_model->fieldIndex("address"));
        m_mapper->addMapping(ui->com_type, m_index);
    
        connect(ui->but_previous, &QPushButton::clicked, m_mapper, &QDataWidgetMapper::toPrevious);
        connect(ui->but_next, &QPushButton::clicked, m_mapper, &QDataWidgetMapper::toNext);
        connect(m_mapper, &QDataWidgetMapper::currentIndexChanged, this, &Widget::updateButtons);
    
        m_mapper->toFirst();     // 显示model第一行数据
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    /**
     * @brief Widget::setupModel
     */
    void Widget::setupModel()
    {
        // 创建并打开数据库
        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    #if 0
        db.setDatabaseName("test.db");        // 使用文件数据库(可生成数据库文件,数据一直有效)
    #else
        db.setDatabaseName(":memory:");       // 使用内存数据库(不会生成数据库文件,所有数据都在内存中进行操作,性能强,程序退出后数据丢失)
    #endif
        if(!db.open())
        {
            QMessageBox::critical(nullptr, "注意!", "打开数据库失败!", QMessageBox::Cancel);
            return;
        }
    
        QSqlQuery query;   // 创建一个用于执行Sql语句的对象
        query.exec("create table person ("           // 创建表
                   "id       int primary  key,"
                   "name     varchar(20),"
                   "address  varchar(200),"
                   "typeid   int)");
        query.exec("insert into person values(1, '张三', '四川<br/>成都', 101)");   // 插入数据
        query.exec("insert into person values(2, '李四', '湖北<br/>武汉', 102)");
        query.exec("insert into person values(3, '王五', '贵州<br/>贵阳', 103)");
        query.exec("insert into person values(4, '唐僧', '东土<br/>大唐', 101)");
    
        // 创建一个表用于保存主表中人物的地址类型
        query.exec("create table addresstype("
                   "id int,"
                   "description varchar(20))");
        query.exec("insert into addresstype values(101, '家庭')");
        query.exec("insert into addresstype values(102, '工作')");
        query.exec("insert into addresstype values(103, '其它')");
    
        m_model = new QSqlRelationalTableModel(this);               // 创建一个支持外键的表格model
        m_model->setTable("person");                                // 设置主表名称
        m_model->setEditStrategy(QSqlTableModel::OnManualSubmit);   // 设置修改数据后不自动保存到数据库
    
        m_index = m_model->fieldIndex("typeid");                    // 返回字段typeid的索引
        m_model->setRelation(m_index, QSqlRelation("addresstype", "id", "description"));  // 设置通过外键关联从表
        m_model->select();                                          // 查询数据库数据
    }
    
    /**
     * @brief       根据当前索引修改按键状态
     * @param row   当前查询数据库表的索引
     */
    void Widget::updateButtons(int row)
    {
        ui->but_previous->setEnabled(row > 0);
        ui->but_next->setEnabled(row < m_model->rowCount() - 1);
    }
    
    
    

4、完整源代码

  • github
  • gitee

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

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

相关文章

MYSQL数据库-复合查询

MYSQL数据库-复合查询零、前言一、基本查询二、多表查询三、自连接四、子查询1、单行子查询2、多行子查询3、多列子查询3、在from子句中使用子查询五、合并查询1、union2、union all零、前言 本章主要讲解学习MYSQL数据库中的复合查询&#xff0c;前面我们讲解的mysql表的查询都…

嵌入式分享合集119

一、传感器的数据处理算法 在传感器使用中&#xff0c;我们常常需要对传感器数据进行各种整理&#xff0c;让应用获得更好的效果&#xff0c;以下介绍几种常用的简单处理方法&#xff1a; 加权平滑&#xff1a;平滑和均衡传感器数据&#xff0c;减小偶然数据突变的影响。 抽取…

502问题怎么排查?

刚工作那会&#xff0c;有一次&#xff0c;上游调用我服务的老哥说&#xff0c;你的服务报"502错误了&#xff0c;快去看看是为什么吧"。 当时那个服务里正好有个调用日志&#xff0c;平时会记录各种200,4xx状态码的信息。于是我跑到服务日志里去搜索了一下502这个数…

【负荷预测】基于贝叶斯网络的考虑不确定性的短期电能负荷预测(Python代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

408 考研《操作系统》第二章第四节:进程同步和进程互斥

文章目录教程1. 进程同步2. 进程互斥3. 总结4. 进程互斥的软件实现方法4.1 单标志法4.2 双标志先检查法4.3 双标志后检查法4.4 Peterson算法4.5 总结5. 进程互斥的硬件实现方法5.1 中断屏蔽方法5.2 TestAndSet指令5.3 Swap指令5.4 总结教程 进程同步和进程互斥 https://www.bi…

【OpenCV学习】第11课:图像金字塔 - 上采样与降采样(高斯金字塔,放大与缩小图像)

仅自学做笔记用,后续有错误会更改 理论 参考文章链接:https://blog.csdn.net/qq_54185421/article/details/124350723 图像金字塔的概念&#xff1a; 从上往下&#xff08;采样点越来越多&#xff09;&#xff1a;上采样 从下往上&#xff08;采样点越来越少&#xff09;&a…

代码随想录刷题|LeetCode 503.下一个更大元素II 42. 接雨水 84.柱状图中最大的矩形

目录 503.下一个更大元素II 思路 下一个更大元素|| 42. 接雨水 思路 双指针法 动态规划 单调栈 接雨水 双指针法 动态规划 单调栈 84.柱状图中最大的矩形 思路 柱状图最大的矩形 动态规划 单调栈 503.下一个更大元素II 题目链接&#xff1a;力扣 思路 与 739. 每日温度 基本相…

STM32 | hex文件、bin文件、axf文件的区别?

已剪辑自: https://mp.weixin.qq.com/s/1EQRooYYpDeKvHpqguik6w 在STM32开发中&#xff0c;经常会碰到hex文件、bin文件与axf文件&#xff0c;这些都是可以烧写到板子里运行的文件。这三个文件有什么区别呢&#xff1f;在这之前&#xff0c;先来一起回顾一下C语言编译的过程&a…

详解c++---模板(初阶)

这里写目录标题为什么会有模板函数模板如何解决类型不同而导致模板无法实例化的问题类的模板为什么会有模板 c语言在面对同一个功能不同的类型的数据时得创建出来多个不同名的函数来依次达到目的&#xff0c;比如说我们下面的代码&#xff1a; #include<stdio.h> int a…

计算机毕业设计ssm+vue基本微信小程序的手机预约维修系统

项目介绍 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势&#xff1a;对于电脑维修预约当然也不能排除在外,随着网络技术的不断成熟,带动了电脑维修预约,它彻底改变了过去传统的管理方式,不仅使服务管理难度变低了,还提升了管理的灵活…

通俗理解数据治理之主数据

1. 定义 1&#xff09;国家标准GB/T 36073-2018 《数据管理能力成熟度评估模型》中对主数据的定义&#xff1a;主数据是组织中需 要跨系统、跨部门进行共享的核心业务实体数据。 2&#xff09;IBM 公司在其有关主 数据管理的红皮书《Master Data Manangement:Rapid Deploymen…

软件测试web自动化测试

今天目标 1、自动化相关概念 2、自动化相关环境搭建 3、元素定位 课程大纲 1.核心重点&#xff08;第二章&#xff09; 2,提高代码质量&#xff0c;自动化水平(第三、四、五、六章) 3.项目实战&#xff08;第七章&#xff09; 4.理论及环境与定位&#xff08;第一章&am…

Linux服务器读写python环境变量

在公司项目开发过程中&#xff0c;代码都是放在服务器中进行运行的&#xff0c;使用本地的idea工具连接到服务器。 如python开发中&#xff0c;将使用pycharm工具连接服务器&#xff0c;如下图所示&#xff1a; 在项目中有线上正式环境、测试环境等&#xff0c;都是用不同环境变…

[附源码]计算机毕业设计计算机相关专业考研资料管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【Keras+计算机视觉+Tensorflow】实现基于YOLO和Deep Sort的目标检测与跟踪实战(附源码和数据集)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一、YOLO目标检测算法 YOLO是端到端的物体检测深度卷积神经网络&#xff0c;YOLO可以一次性预测多个候选框&#xff0c;并直接在输出层回归物体位置区域和区域内物体所属类别&#xff0c;而Faster R-CNN仍然是采用R-CNN那种…

Windows 下Zookeeper 配置参数解读 和查看注册了哪些服务

zookeeper 配置文件解读 本地配置文件奉上: # The number of milliseconds of each tick tickTime2000 # The number of ticks that the initial # synchronization phase can take initLimit10 # The number of ticks that can pass between # sending a request and gett…

图像处理学习笔记-10-图像分割与边缘检测

图像分割的三大类方法&#xff1a;根据区域间灰度不连续搜寻区域之间的边界&#xff0c;在奇异性检测、边缘连接和边界检测介绍&#xff1b;以像素性质的分布进行阈值处理&#xff0c;在阈值处理介绍&#xff1b;直接搜寻区域进行分割&#xff0c;在基于区域的分割中介绍 奇异…

数据库、计算机网络,操作系统刷题笔记8

数据库、计算机网络&#xff0c;操作系统刷题笔记8 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&…

网站各个功能基本实现

1.前面已经介绍前后端的交互 2.今天实现网站功能的基本实现 也就是查询数据库。 网站类型为展示型网站。 页面如下&#xff1a; 点击政府公告显示&#xff1a; 点击机构设置显示&#xff1a; 后面不一一展示&#xff0c;主要实现六大功能的展示功能。 后续就实现管理员维…

PostgREST的安装部署(Windows和Linux环境)

下载地址&#xff1a;https://github.com/PostgREST/postgrest/releases 官方文档地址&#xff1a;Overview of Role System — PostgREST 9.0.0 documentation Windows 先下载对应系统的安装包&#xff1a; 下载之后解压会得到一个postgrest.exe可执行文件 创建配置文件&a…