Pyside6(PyQT5)中的QTableView与QSqlQueryModel、QSqlTableModel的联合使用
QTableView 是QT的一个强大的表视图部件,可以与模型结合使用以显示和编辑数据。QSqlQueryModel、QSqlTableModel 都是用于与 SQL 数据库交互的模型,将二者与QTableView结合使用可以轻松地展示和编辑数据库的数据。
QSqlQueryModel的简单应用
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QTableView
from PySide6.QtSql import QSqlDatabase, QSqlQueryModel# 创建应用程序实例
app = QApplication(sys.argv)# 连接到SQLite数据库
# 假设脚本同目录下的数据库文件名为example.db,表名为example_table
db = QSqlDatabase.addDatabase('QSQLITE') # 指定使用的数据库驱动为SQLite
db.setDatabaseName('example.db') # 设置数据库文件路径
if not db.open(): # 如果数据库打开失败,打印错误信息print("无法连接到数据库")sys.exit(1)# 创建数据模型
model = QSqlQueryModel()
model.setQuery("SELECT * FROM users") # 执行SQL查询# 创建主窗口
window = QMainWindow()
window.setWindowTitle("SQLite数据展示")# 创建表格视图,并设置模型
table_view = QTableView()
table_view.setModel(model) # 将查询模型设置给表格视图
window.setCentralWidget(table_view) # 将表格视图设置为主窗口的中心部件# 显示窗口
window.show()# 运行应用程序循环
sys.exit(app.exec())
上面的这个代码是查询数据库并将结果用表格方式展示的基本应用,在这个代码中,使用了QSqlQueryModel模型,表格的数据只是用于展示,并不能在表格中对数据进行编辑和修改。
QSqlTableModel的简单应用
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QTableView
from PySide6.QtSql import QSqlDatabase, QSqlTableModel
from PySide6.QtCore import Qt# 创建应用程序实例
app = QApplication(sys.argv)# 设置数据库
db = QSqlDatabase.addDatabase("QSQLITE") # 设置数据库类型
db.setDatabaseName("project_db.db") # 设置数据库名称
if not db.open():print("无法打开数据库")sys.exit(1)# 创建模型
model = QSqlTableModel() # 创建模型
model.setTable("users") # 设置模型与数据表关联# 设置模型的编辑策略(可选)
model.setEditStrategy(QSqlTableModel.OnFieldChange) # 数据更改后立即写入数据库# 选择表中的所有记录
model.select() # 创建主窗口
window = QMainWindow()
window.setWindowTitle("SQLite数据展示")# 创建表格视图,并设置模型
table_view = QTableView()
table_view.setModel(model) # 将查询模型设置给表格视图
window.setCentralWidget(table_view) # 将表格视图设置为主窗口的中心部件# 可选:设置列标题
# model.setHeaderData(0, Qt.Horizontal, "ID")
# model.setHeaderData(1, Qt.Horizontal, "name")
# model.setHeaderData(2, Qt.Horizontal, "passwd")# 显示窗口
window.show()# 运行应用程序循环
sys.exit(app.exec())
这段代码使用了QSqlTableModel类来创建一个数据库模型。QSqlTableModel是一个高层次的接口,用于处理单个数据库表,并且可以与视图(如QTableView)一起使用来显示和编辑表中的数据。当我们在界面显示的表格中将管理员密码修改为“123”,数据库中的内容同步得到了更新。
QSqlQueryModel与QSqlTableModel的区别
• 功能定位
• QSqlQueryModel :
• 功能:用于执行 SQL 查询语句,并将查询结果以模型的形式展示。
• 特点:它是一个只读模型,主要用于显示查询结果。如果需要修改数据,必须手动执行 SQL 更新语句。
• 适用场景:适合用于执行复杂的 SQL 查询,并将结果展示在视图中(如 QTableView 或 QListView )。例如,联合查询、分组查询等场景。
• QSqlTableModel :
• 功能:提供了一个可编辑的模型,用于操作数据库表中的数据。
• 特点:支持对表数据的增、删、改、查操作,可以直接通过模型接口修改数据,而无需手动编写 SQL 语句。
• 适用场景:适合用于直接操作单个数据库表的场景,尤其是需要对表数据进行编辑的应用。
•数据操作方式
• QSqlQueryModel :
• 查询:通过执行 SQL 查询语句获取数据。
• 修改:不支持直接通过模型修改数据。如果需要修改数据,必须手动执行 SQL 更新语句。
• QSqlTableModel :
• 查询:自动加载整个表的数据,也可以通过设置过滤条件来限制显示的数据。
• 修改:支持通过模型接口直接修改数据,例如插入、删除、更新行。
• 灵活性与易用性
• QSqlQueryModel :
• 优点:灵活性高,可以执行任意复杂的 SQL 查询语句。
• 缺点:不支持直接修改数据,需要手动编写 SQL 更新语句。
• QSqlTableModel :
• 优点:操作简单,支持直接通过模型接口修改数据,适合对单个表的操作。
• 缺点:只能操作单个表,不支持复杂的 SQL 查询(如联合查询)。
• 性能
• QSqlQueryModel :
• 性能:查询结果直接从 SQL 查询语句生成,性能较高,尤其是对于复杂的查询。
• QSqlTableModel :
• 性能:加载整个表的数据,可能会在数据量较大时影响性能。但如果设置了过滤条件,可以限制加载的数据量。
• 适用场景总结
• QSqlQueryModel :
• 适用于需要执行复杂查询(如联合查询、分组查询)的场景。
• 适用于只读数据展示的场景。
• QSqlTableModel :
• 适用于对单个表进行增、删、改、查操作的场景。
• 适用于需要简单数据操作且对性能要求不高的场景。
QSqlQueryModel的另一个范例
这个范例中设置了筛选条件,只显示符合条件的部分数据
from PySide6.QtSql import QSqlQueryModel, QSqlDatabase
from PySide6.QtWidgets import QApplication, QTableView# 定义create_connection函数,用于创建数据库连接
def create_connection():# 添加一个SQLite数据库驱动db = QSqlDatabase.addDatabase('QSQLITE')# 设置数据库名称为example.dbdb.setDatabaseName('example.db')# 尝试打开数据库连接if not db.open():# 如果打开失败,打印错误信息并返回Falseprint("Unable to open database")return False# 如果打开成功,返回Truereturn Truedef main(): app = QApplication([])# 调用create_connection函数,如果返回False则终止程序if not create_connection():return# 创建一个QSqlQueryModel实例,用于执行SQL查询并将结果存储在模型中model = QSqlQueryModel()# 设置模型的查询语句,这里选择年龄大于30的员工记录model.setQuery("SELECT * FROM employees WHERE age > 30")# 创建一个QTableView实例,用于显示模型中的数据view = QTableView()# 将模型设置到视图中view.setModel(model)# 显示视图view.show()# 进入Qt应用程序的事件循环app.exec()# 如果当前脚本是直接运行的,则调用main函数
if __name__ == "__main__":main()
QSqlTableModel的另一个范例
这个范例中同样设置了筛选条件,只显示符合条件的部分数据
from PySide6.QtSql import QSqlTableModel, QSqlDatabase
from PySide6.QtWidgets import QApplication, QTableView# 定义一个函数用于创建数据库连接
def create_connection():# 添加一个SQLite数据库驱动db = QSqlDatabase.addDatabase('QSQLITE')# 设置数据库文件的名称db.setDatabaseName('example.db')# 尝试打开数据库连接if not db.open():# 如果打开失败,打印错误信息并返回Falseprint("Unable to open database")return False# 如果打开成功,返回Truereturn True# 主函数
def main():app = QApplication([])# 调用函数创建数据库连接,如果失败则退出程序if not create_connection():return# 创建一个QSqlTableModel实例,用于操作数据库中的数据model = QSqlTableModel()# 设置操作的表名为"employees"model.setTable("employees")# 设置过滤条件,只显示年龄大于30的记录model.setFilter("age > 30")# 执行查询操作model.select()# 创建一个QTableView实例,用于显示数据view = QTableView()# 将数据模型设置到视图上view.setModel(model)# 显示视图view.show()# 进入Qt应用程序的事件循环app.exec_()# 如果当前脚本是主程序,则执行main函数
if __name__ == "__main__":main()
QSqlQueryModel与QSqlQuery的区别
在 QT中,还有一个类 QSqlQuery
,它与QSqlQueryMode
在功能和用途上有一定的区别和联系。
QSqlQuery
QSqlQuery
是一个用于执行 SQL 语句的类。它可以用来执行各种 SQL 操作,如 SELECT、INSERT、UPDATE 和 DELETE 等。
QSqlQuery
对象通常与一个具体的数据库连接相关联,并且可以执行单条 SQL 语句或存储过程。
以下是 QSqlQuery
的一些主要功能:
- 执行 SQL 语句:可以执行任意的 SQL 语句,包括查询和修改数据。
- 游标操作:支持向前和向后移动游标,以便处理查询结果。
- 绑定值:可以使用绑定值来防止 SQL 注入,并提高性能。
- 存储过程:可以执行存储过程。
示例代码:
from PySide6.QtSql import QSqlDatabase, QSqlQuerydb = QSqlDatabase.addDatabase('QSQLITE') # 添加SQLite 数据库驱动
db.setDatabaseName('example.db') # 设置数据库名称
db.open() # 打开数据库query = QSqlQuery(db) # 创建一个数据库查询对象
query.exec_('SELECT * FROM table_name') # 执行SQL查询语句
while query.next():print(query.value(0))
二者的关系
QSqlQueryModel
内部使用 QSqlQuery
来执行 SQL 查询并获取数据。当为 QSqlQueryModel
设置一个查询时,它会使用 QSqlQuery
来执行该查询,并将结果存储在模型中,以便视图可以显示这些数据。
总结一下,QSqlQuery
是用于执行 SQL 语句的低级接口,而 QSqlQueryModel
是一个更高层次的抽象,它利用 QSqlQuery
来提供与数据库数据的集成,并与 Qt 的模型/视图架构无缝集成。
相关文章:

Pyside6(PyQT5)中的QTableView与QSqlQueryModel、QSqlTableModel的联合使用
QTableView 是QT的一个强大的表视图部件,可以与模型结合使用以显示和编辑数据。QSqlQueryModel、QSqlTableModel 都是用于与 SQL 数据库交互的模型,将二者与QTableView结合使用可以轻松地展示和编辑数据库的数据。 QSqlQueryModel的简单应用 import sys from PySid…...

git常用命令学习
目录 文章目录 目录第一章 git简介1.Git 与SVN2.Git 工作区、暂存区和版本库 第二章 git常用命令学习1.ssh设置2.设置用户信息3.常用命令设置1.初始化本地仓库init2.克隆clone3.查看状态 git status4.添加add命令5.添加评论6.分支操作1.创建分支2.查看分支3.切换分支4.删除分支…...

【优选算法】7----三数之和
来了来了,他来了,又是学习算法的一天~ 今天的嘉宾是中等难度的算法题----三数之和! ------------------------------------------begin------------------------------------ 题目解析: 哇趣!又是给了一个数组&#…...
分子动力学模拟里的术语:leap-frog蛙跳算法和Velocity-Verlet算法
分子动力学模拟(Molecular Dynamics Simulation,简称MD)是一种基于经典力学原理的计算物理方法,用于模拟原子和分子在给定时间内的运动和相互作用。以下是关于分子动力学模拟的一些核心术语和概念: 定义系统&am…...

2025年数学建模美赛:A题分析(1)Testing Time: The Constant Wear On Stairs
2025年数学建模美赛 A题分析(1)Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析(2)楼梯磨损分析模型 2025年数学建模美赛 A题分析(3)楼梯使用方向偏好模型 2025年数学建模美赛 A题分…...
利用 SoybeanAdmin 实现前后端分离的企业级管理系统
引言 随着前后端分离架构的普及,越来越多的企业级应用开始采用这种方式来开发。前后端分离不仅提升了开发效率,还让前端和后端开发可以并行进行,减少了相互之间的耦合度。SoybeanAdmin 是一款基于 Spring Boot 和 MyBatis-Plus 的后台管理系…...

996引擎 - 前期准备-配置开发环境
996引擎 - 前期准备 官网搭建服务端、客户端单机搭建 开发环境配置后端开发环境配置环境 前端开发环境配置环境 后端简介前端简介GUILayoutGUIExport 官网 996传奇引擎官网 所有资料从官网首页开始,多探索。 文档: 996M2-服务端Lua 996M2-客户端Lua 搭…...

Tensor 基本操作4 理解 indexing,加减乘除和 broadcasting 运算 | PyTorch 深度学习实战
前一篇文章,Tensor 基本操作3 理解 shape, stride, storage, view,is_contiguous 和 reshape 操作 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started Tensor 基本使用 索引 indexing示例代码 加减…...

【Uniapp-Vue3】request各种不同类型的参数详解
一、参数携带 我们调用该接口的时候需要传入type参数。 第一种 路径名称?参数名1参数值1&参数名2参数值2 第二种 uni.request({ url:"请求路径", data:{ 参数名:参数值 } }) 二、请求方式 常用的有get,post和put 三种,默认是get请求。…...

【Prometheus】Prometheus如何监控Haproxy
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

SSM开发(一)JAVA,javaEE,spring,springmvc,springboot,SSM,SSH等几个概念区别
目录 JAVA 框架 javaEE spring springmvc springboot SSM SSH maven JAVA 一种面向对象、高级编程语言,Python也是高级编程语言;不是框架(框架:一般用于大型复杂需求项目,用于快速开发)具有三大特性,所谓Jav…...
HTML5 常用事件详解
在现代 Web 开发中,用户交互是提升用户体验的关键。HTML5 提供了丰富的事件机制,允许开发者监听用户的操作(如点击、拖动、键盘输入等),并触发相应的逻辑处理。本文将详细介绍 HTML5 中的常用事件,包括鼠标…...

TCP全连接队列
1. 理解 int listen(int sockfd, int backlog) 第二个参数的作用 backlog:表示tcp全连接队列的连接个数1。 如果连接个数等于backlog1,后续连接就会失败,假设tcp连接个数为0,最大连接个数就为1,并且不accept获取连接…...

统计文本文件中单词频率的 Swift 与 Bash 实现详解
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...

iOS 权限管理:同时请求相机和麦克风权限的最佳实践
引言 在开发视频类应用时,我们常常会遇到需要同时请求相机和麦克风权限的场景。比如,在用户发布视频动态时,相机用于捕捉画面,麦克风用于录制声音;又或者在直播功能中,只有获得这两项权限,用户…...
Excel 实现文本拼接方法
1. 使用 & 运算符 这是最常见和简单的拼接方法。你只需使用 & 来连接多个文本单元格或文本字符串。 示例公式: A1 & B1这个公式会将 A1 和 B1 单元格中的文本合并为一个字符串。 如果你希望在文本之间加入分隔符(如空格、逗号等…...
软考信安27~Windows操作系统安全相关
1、Windows账户与组管理 1.1、用户账户查看 whoami #查看当前登录的用户名称 whoami /all #查看当前系统的用户名和组信息,以及SID whoami /user #查看当前用户的SID net user #查看系统中包含哪些用户 wmic useraccount get name,sid #查看…...

从 Spark 到 StarRocks:实现58同城湖仓一体架构的高效转型
作者:王世发,吴艳兴等,58同城数据架构部 导读: 本文介绍了58同城在其数据探查平台中引入StarRocks的实践,旨在提升实时查询性能。在面对传统Spark和Hive架构的性能瓶颈时,58同城选择StarRocks作为加速引擎&…...
WordPress Hunk Companion插件节点逻辑缺陷导致Rce漏洞复现(CVE-2024-9707)(附脚本)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...

使用 HTML 开发 Portal 页全解析
前言 在当今数字化时代,网站作为企业和个人展示信息、提供服务的重要窗口,其重要性不言而喻。而 Portal 页,作为网站的核心页面之一,承担着引导用户、整合信息等关键任务。那么,如何使用 HTML 开发一个功能齐全、界面…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...