QSqlTableModel结合使用数据库心得

news2024/11/16 3:37:14

文章目录

    • 目的
    • QSqlTableModel
    • 采用Model-View-Delegate(模型视图代理)框架的整体结构
    • QT数据库组件
      • 用户界面层(UI Layer)
      • SQL接口层(SQL API Layer)
      • 驱动程序层(Driver Layer)
    • 实现翻页功能
    • 实现数据库查询功能
      • QSqlDatabase
      • QSqlQuery
      • QSqlRecord

目的

1: 了解QSqlTableMode 与 数据库集合使用
2: 了解mvc结构带来便利性
3: 数量级数据以及如何实现预览

QSqlTableModel

qt 文档如是说:

The QSqlTableModel class provides an editable data model for a single database table.
QSqlTableModel is a high-level interface for reading and writing database records from a single table. 
It is built on top of the lower-level QSqlQuery and can be used to provide data to view classes such as QTableView. 
     QSqlTableModel *model = new QSqlTableModel;
     model->setTable("employee");
     model->setEditStrategy(QSqlTableModel::OnManualSubmit);
     model->select();
     model->setHeaderData(0, Qt::Horizontal, tr("Name"));
     model->setHeaderData(1, Qt::Horizontal, tr("Salary"));

     QTableView *view = new QTableView;
     view->setModel(model);
     view->hideColumn(0); // don't show the ID
     view->show();

We set the SQL table's name and the edit strategy, then we set up the labels displayed in the view header.
 The edit strategy dictates when the changes done by the user in the view are actually applied to the database. The possible values are OnFieldChange, OnRowChange, and OnManualSubmit.
QSqlTableModel can also be used to access a database programmatically, without binding it to a view:
     QSqlTableModel model;
     model.setTable("employee");
     model.select();
     int salary = model.record(4).value("salary").toInt();
     The code snippet above extracts the salary field from record 4 in the result set of the query SELECT * from employee.
It is possible to set filters using setFilter(), or modify the sort order using setSort(). At the end, you must call select() to populate the model with data.
The tablemodel example illustrates how to use QSqlTableModel as the data source for a QTableView.
QSqlTableModel provides no direct support for foreign keys. Use the QSqlRelationalTableModel and QSqlRelationalDelegate if you want to resolve foreign keys.

采用Model-View-Delegate(模型视图代理)框架的整体结构

在这里插入图片描述
图中Model就是模型,View是视图,Delegate是代理。三者之间的关系看图已经很清楚了。其中,View用于用户界面交互,包括数据展示的总体框架等;Model用于向View提供数据支持,包括查询数据和保存数据(修改和插入);Delegate用于具体展示数据和具体提供数据编辑功能的用户交互界面。

可以通过QTableView显示对应表格数据。

QT数据库组件

QT数据库模块整体结构
在这里插入图片描述
QT数据库模块包含了用户界面层(UI Layer)、SQL接口层(SQL API Layer),和驱动程序层(Driver Layer)。

在QT应用程序中使用QT数据库模块,必须在项目文件中做如下配置。
对于CMake编译构建管理工具:
QT数据库模块CMake编译构建管理项目配置
在这里插入图片描述
对于qmake编译构建管理工具:
QT数据库模块qmake编译构建管理项目配置
在这里插入图片描述

用户界面层(UI Layer)

这里的UI可以理解成是数据库模块的普通应用开发者的API 接口;按照QT模型视图代理框架的概念体系,这个UI也可以理解成是这些类型可能会放在用户界面相关的程序代码中去用,比如在与视图有关的代码中去调用这些API。
比如QSqlQueryModel经常作为模型类型在模型视图代理框架中使用,当然也可以独立使用。

SQL接口层(SQL API Layer)

QT数据库模块使用QSqlDatabase类型提供通用的数据库的连接和SQL查询操作的API接口。

驱动程序层(Driver Layer)

QT数据库模块使用QSqlDriver类型定义了一些数据库的一些抽象的底层操作。特定数据库相关的具体实现有特定数据库对应的派生类提供。
QT 助手API DOC中描述了QT框架对特定数据库的支持情况如下图所示:
QT数据库模块驱动程序层
在这里插入图片描述

博客参考整理

基于此可以对于千万级数据显示处理效率上还是不错。

实现翻页功能

如果大量数据查询以及显示在ui上, 那必定会加载时间过长, 导致让人体验很不爽。
因此我们要考虑到分页 + 数据查询。

QSqlTableModel+QTableView的组合完成需求,同时要对应QSqlDatabase作为数据库来源对数据进行掌握。
QSqlTableModel 本身不支持分页显示逻辑数据。我们可以通过在selectStatment中进行适当修改去显示某特定页数据。

.h

#ifndef KDSQLTABLEMODEL_H
#define KDSQLTABLEMODEL_H

#include <QSqlTableModel>
#include <QObject>
#include <QtGlobal>

class KDSqlTableModelPrivate;
class KDSqlTableModel : public QSqlTableModel
{
   
    Q_OBJECT
    Q_DECLARE_PRIVATE(KDSqlTableModel)
public:
    explicit KDSqlTableModel(QObject *parent = nullptr, QSqlDatabase db = QSqlDatabase(<

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

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

相关文章

基于wireguard与NAT实现windows10代理服务器

参考文章&#xff1a;https://blog.csdn.net/babytiger/article/details/127111474 一、 下载windows 安装包 下载wireguard安装包 二、 配置服务端&#xff1a; 新建空隧道并保存为server1&#xff0c;配置如下&#xff1a; 点击保存&#xff0c;并连接&#xff0c;多了个se…

STM32-创建项目流程

一、基于STM官网得库进行开发 准备工作&#xff1a;下载STM库文件 1、创建项目文件夹 2、在keil 中new uVision project,然后选择刚刚创建得文件夹&#xff0c;在文件夹里面创建一个文件&#xff0c;用来存放这个项目&#xff0c;然后在文件夹里面&#xff0c;写个文件名&am…

HHDBCS扩展数据库类型

为应对市面上的数据库种类繁多的问题&#xff0c;HHDBCS设置了扩展数据库功能。 在登陆界面点击“工具”&#xff0c;选择“扩展数据库类型”&#xff1b; 注&#xff1a;HHDBCS支持已kingbase&#xff0c;本文仅用来举例。 填入名称、所需数据库的信息&#xff0c;上传驱动…

Cesium 展示——实现右键菜单功能

文章目录 需求分析需求 在 Cesium 上实现右键菜单功能,使得对Cesium上的实体或其他可进行操作 分析 参考自文章:实现右键出现菜单选项功能 分析该需求,流程如下 写一个 div 作为右键弹出的菜单选项 ——> 监听鼠标右键事件——> 添加 Cesium 鼠标右击事件——>…

Jmeter分布式压测 —— 易踩坑点

1、压测机 无论是从成本角度还是维护的难易方面&#xff0c;压测机的数量&#xff0c;适量就好。举个例子&#xff0c;8C16G的一台服务器&#xff0c;部署Jmeter后&#xff0c;根据我个人的测试比对数据&#xff0c;配置≤1500个线程数&#xff0c;最好。太多了性能损耗较大&a…

文件夹批量重命名:如何利用上级目录给多个文件夹进行高效重命名

在文件管理中&#xff0c;我们经常需要处理大量的文件和文件夹。其中&#xff0c;文件名过长或混乱的问题经常让我们感到困扰。这不仅影响了我们的工作效率&#xff0c;还可能导致一些错误。为了解决这个问题&#xff0c;我们可以用云炫文件管理器将“上级目录”批量重命名文件…

[一] C++入门

摘要&#xff1a;OOP(面向对象)&#xff0c;namespace&#xff0c;cout and cin&#xff0c;缺省参数&#xff0c;函数重载&#xff0c;引用&#xff0c;内联函数&#xff0c;auto&#xff0c;范围 for&#xff0c;nullptr 20世纪80年代&#xff0c;计算机界提出了OOP(object o…

我和“云栖大会”的双向奔赴

目录 引言初次参加云栖大会云栖大会带来的技术风向标本届大会最强技术有哪些&#xff1f;云栖大会对我职业生涯的影响个人对未来云栖大会的期待和建议结语 引言 想必大家对“云栖大会”并不陌生&#xff0c;“云栖大会”作为国内最具规模和影响力的云计算盛会&#xff0c;每年…

flink状态不能跨算子

背景 在flink中进行状态的维护和管理应该是我们经常做的事情&#xff0c;但是有些同学认为名称一样的状态在不同算子之间的状态是同一个&#xff0c;事实是这样吗&#xff1f; flink状态在保存点中的存放示意图 事实上&#xff0c;每个状态都归属于对应的算子&#xff0c;也…

用红黑树封装mapset【C++】

目录 前言 一&#xff0c;定义 二&#xff0c;完善set&map比较 三&#xff0c;迭代器实现 operator operator-- operator[] 四&#xff0c;发现问题 解决 修改一&#xff1a; set封装层面 修改二&#xff1a;正向迭代器修改 下期预告&#xff1a; 哈希&#x…

DataxWeb安装部署及使用--真香警告

DataxWeb安装部署及使用–真香警告 文章目录 1.Datax简介1.1 Datax是什么&#xff1f;1.2 Datax的架构1.3 设计理念1.4 DataX3.0框架设计1.5 DataX3.0插件体系1.6 DataX3.0核心架构1.6.1 核心模块介绍1.6.2 DataX调度流程 2.DataxWeb简介2.1 DataxWeb是什么&#xff1f;2.2 Dat…

在Ubuntu上安装Redis并学习使用get、set和keys命令

目录 安装Redis切换到root用户搜索redis相关软件包安装redis修改配置文件重启服务器使用redis客户端连接服务器 get与set命令keys 安装Redis 我们在Ubuntu20.04上进行Redis的安装 切换到root用户 使用su命令&#xff1a; 在终端中&#xff0c;输入su并按回车键。然后输入roo…

【产品应用】一体化伺服电机在焊接设备中的应用

随着制造业的不断发展&#xff0c;焊接设备在许多领域都得到了广泛应用&#xff0c;如汽车制造、机械加工、钢结构等领域。为了提高焊接设备的性能和效率&#xff0c;许多厂家开始采用一体化伺服电机作为焊接设备的主要驱动部件。本文将介绍一体化伺服电机在焊接设备中的应用背…

Leetcode—485.最大连续1的个数【简单】

2023每日刷题&#xff08;十五&#xff09; Leetcode—485.最大连续1的个数 实现代码 int findMaxConsecutiveOnes(int* nums, int numsSize){int max 0;int i;int flag 0;int cnt 0;for(i 0; i < numsSize; i) {if(nums[i] 1) {if(flag 0) {flag 1;cnt 1;} else {…

python 实时读取文件数据生成折线图——Matplotlib

有时&#xff0c;为了方便看数据的变化情况&#xff0c;需要画一个动态图来看整体的变化情况。主要就是用Matplotlib库。 效果演示&#xff1a; 代码如下&#xff1a; import matplotlib.pyplot as plt import pandas as pdfilename data.log# 创建空的 DataFrame 对象 df …

开心打地鼠,Android小游戏开发

A. 项目描述 “开心打地鼠”是一款非常有趣的游戏&#xff0c;它能够帮助人们放松身心&#xff0c;同时也能够锻炼人们的智力。 “开心打地鼠”这款游戏的玩法非常简单&#xff0c;玩家需要在规定的时间内点击屏幕上出现的地鼠&#xff0c;每次点击都可以得到一定的分数。但是…

kafka动态认证 自定义认证 安全认证-亲测成功

kafka动态认证 自定义认证 安全认证-亲测成功 背景 Kafka默认是没有安全机制的&#xff0c;一直在裸奔。用户认证功能&#xff0c;是一个成熟组件不可或缺的功能。在0.9版本以前kafka是没有用户认证模块的&#xff08;或者说只有SSL&#xff09;&#xff0c;好在kafka0.9版本…

基于CMFB余弦调制滤波器组的频谱响应matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、CMFB余弦调制滤波器组原理 4.2、CMFB调制过程 4.3、CMFB特点 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ......................…

【Linux】 unzip 命令使用

Unzip 是一个在 Unix 或类 Unix 系统&#xff08;例如 Linux&#xff09;中常用的命令行工具&#xff0c;用于解压缩由 ZIP 压缩算法创建的压缩文件。这个工具是开源的&#xff0c;并且通常在大多数的 Linux 发行版中默认安装。 语法 su [选项] [-] [USER [参数]...] unzip命令…

题号1575 C.难度排名 (并查集知识点)

题目&#xff1a; 样例1&#xff1a; 输入 1 4 3 1 4 2 4 3 4 输出 No 样例2&#xff1a; 输入 1 4 2 1 3 2 3 输出 Yes 思路&#xff1a; 这题&#xff0c;有两种情况是由矛盾的。 第一种情况&#xff1a;当前题号存在大于两个题号的相连&#xff0c;情况是矛盾的&#x…