当前位置: 首页 > news >正文

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 的一些主要功能:

  1. 执行 SQL 语句:可以执行任意的 SQL 语句,包括查询和修改数据。
  2. 游标操作:支持向前和向后移动游标,以便处理查询结果。
  3. 绑定值:可以使用绑定值来防止 SQL 注入,并提高性能。
  4. 存储过程:可以执行存储过程。

示例代码:

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 单元格中的文本合并为一个字符串。 如果你希望在文本之间加入分隔符(如空格、逗号等&#xf…...

软考信安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 开发一个功能齐全、界面…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践

前言&#xff1a;本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中&#xff0c;跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南&#xff0c;你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案&#xff0c;并结合内网…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器

一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下&#xff0c;音视频内容犹如璀璨繁星&#xff0c;点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频&#xff0c;到在线课堂中知识渊博的专家授课&#xff0c;再到影视平台上扣人心弦的高清大片&#xff0c;音…...

如何通过git命令查看项目连接的仓库地址?

要通过 Git 命令查看项目连接的仓库地址&#xff0c;您可以使用以下几种方法&#xff1a; 1. 查看所有远程仓库地址 使用 git remote -v 命令&#xff0c;它会显示项目中配置的所有远程仓库及其对应的 URL&#xff1a; git remote -v输出示例&#xff1a; origin https://…...

stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)

这是系统中断服务程序的默认处理汇编函数&#xff0c;如果我们没有定义实现某个中断函数&#xff0c;那么当stm32产生了该中断时&#xff0c;就会默认跑这里来了&#xff0c;所以我们打开了什么中断&#xff0c;一定要记得实现对应的系统中断函数&#xff0c;否则会进来一直循环…...

【阅读笔记】MemOS: 大语言模型内存增强生成操作系统

核心速览 研究背景 ​​研究问题​​&#xff1a;这篇文章要解决的问题是当前大型语言模型&#xff08;LLMs&#xff09;在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色&#xff0c;但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成&#xff08;RA…...

C# WPF 左右布局实现学习笔记(1)

开发流程视频&#xff1a; https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源码&#xff1a; GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF应用&#xff08;.NET Framework) 2.…...