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()

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

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

相关文章

uniapp+Vue3(<script setup lang=“ts“>)模拟12306城市左右切换动画效果

效果图&#xff1a; 代码&#xff1a; <template><view class"container"><view class"left" :class"{ sliding: isSliding }" animationend"resetSliding">{{ placeA }}</view><view class"center…

OFD、PDF 电子签章系统处理流程

在C#中实现电子签章系统的处理流程&#xff0c;可以参考以下步骤和技术实现&#xff1a; 1. 电子签章系统的基本流程 电子签章系统的核心流程包括以下几个步骤&#xff1a; 密钥生成&#xff1a;生成公钥和私钥对&#xff0c;私钥由签章人保管&#xff0c;公钥用于验证签名。…

VUE elTree 无子级 隐藏展开图标

这4个并没有下级节点&#xff0c;即它并不是叶子节点&#xff0c;就不需求展示前面的三角展开图标! 查阅官方文档如下描述&#xff0c;支持bool和函数回调处理&#xff0c;这里咱们选择更灵活的函数回调实现。 给el-tree结构配置一下props&#xff0c;注意&#xff01; :pr…

Ansys Motor-CAD:IPM 电机实验室 - 扭矩速度曲线

各位电动机迷们&#xff0c;大家好&#xff1a; 在本博客中&#xff0c;我讨论了如何使用 Ansys Motor-CAD 通过 LAB 模块获取扭矩速度曲线。使用每安培最大扭矩电机控制策略&#xff0c;并涵盖恒定扭矩区域和恒定功率、磁通减弱区域。分析了高转子速度如何影响功率输出。 模型…

网络(三) 协议

目录 1. IP协议; 2. 以太网协议; 3. DNS协议, ICMP协议, NAT技术. 1. IP协议: 1.1 介绍: 网际互连协议, 网络层是进行数据真正传输的一层, 进行数据从一个主机传输到另一个主机. 网络层可以将数据主机进行传送, 那么传输层保证数据可靠性, 一起就是TCP/IP协议. 路径选择: 确…

docker ubuntu:20.04构建c++ grpc环境

由c grpc必须源码编译&#xff0c;ubuntu版本不同可能出现的问题也不同&#xff0c;这里分享下我的构建过程。 我是vscode结合docker去安装c虚拟环境&#xff0c;我不想污染本机环境。 vscode的插件Dev Containers Dockerfile如下(如果单纯是ubuntu环境构建&#xff0c;可忽略该…

数据结构:二叉树—面试题(一)

目录 1、相同的树 2、另一棵树的子树 3、翻转二叉树 4、平衡二叉树 5、对称二叉树 6、二叉树遍历 7、二叉树的分层遍历 1、相同的树 习题链接https://leetcode.cn/problems/same-tree/description/https://leetcode.cn/problems/same-tree/description/ 描述&#xff1a…

MySQL训练营-慢查询诊断问题

慢查询相关参数和建议配置 slow_query_log long_query_time 日志开关&#xff0c;是否记慢查询日志以及超过多长时间判定为慢查询。 查看参数设置&#xff1a; SHOW VARIABLES LIKE ‘slow_query_log’;SHOW VARIABLES LIKE ‘long_query_time’; 实践建议&#xff1a; …

thinkphp8在使用apidoc时, 4层的接口会有问题 解决办法

thinkphp8 4层的接口会有问题, 比如这样的接口 /adminapi/notice/announcements/lists, 应该换成 /adminapi/notice.announcements/lists 这样才行, 有没有人处理过? 实际上在官网的帮助里有描述 自动生成的url不对&#xff1f; | Apidoc // config/apidoc.php //... auto_url…

python+playwright自动化测试(四):元素操作(键盘鼠标事件)、文件上传

目录 鼠标事件 悬停 移动 按键 点击 滚轮操作 拖拽 键盘事件 输入文本内容 type输入内容 fill输入内容 按键操作press 文件上传 下拉选/单选框/复选框 滚动条操作 鼠标事件 悬停 page.get_by_text(设置,exactTrue).nth(1).hover() 移动 page.mouse.move(x33…

SQL Server所有数据类型大全

数据类型列表 整数类型&#xff1a;bigint、int、smallint、tinyint精确数值类型&#xff1a;decimal、numeric近似数值类型&#xff1a;float、real字符类型&#xff1a;char、varchar、text、nchar、nvarchar、ntext日期和时间类型&#xff1a;date、time、datetime2、dateti…

SQL-leetcode—1164. 指定日期的产品价格

1164. 指定日期的产品价格 产品数据表: Products ---------------------- | Column Name | Type | ---------------------- | product_id | int | | new_price | int | | change_date | date | ---------------------- (product_id, change_date) 是此表的主键&#xff08;具…

用edge浏览器追剧音量太小?安装音量增强器可解忧

0 源起 春节佳节将至&#xff0c;可以利用这个难得的假期追一追想看而没空看的剧了。 但是在用Edge浏览器播放网页中的视频时&#xff0c;有时音量太小&#xff0c;根本没法听清楚&#xff0c; 遇到这种情况时&#xff0c;尽管Edge浏览器本身没有提供音量控制功能&#xff0…

Linux-arm(1)ATF启动流程

Linux-arm(1)ATF启动流量 Author&#xff1a;Once Day Date&#xff1a;2025年1月22日 漫漫长路有人对你微笑过嘛… 全系列文章可查看专栏: Linux实践记录_Once_day的博客-CSDN博客 参考文档&#xff1a; ARM Trusted Firmware分析——启动、PSCI、OP-TEE接口 Arnold Lu 博…

解决docker: ‘buildx‘ is not a docker command.

简介 buildx 是 Docker 官方提供的一个构建工具&#xff0c;它可以帮助用户快速、高效地构建 Docker 镜像&#xff0c;并支持多种平台的构建。使用 buildx&#xff0c;用户可以在单个命令中构建多种架构的镜像&#xff0c;例如 x86 和 ARM 架构&#xff0c;而无需手动操作多个…

【小游戏篇】三子棋游戏

硬控我一上午&#xff0c;小编还是太菜了&#xff0c;大家可以自行升级电脑难度&#xff0c;也可以升级游戏到五子棋 1.game.h #pragma once #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3//初始化棋盘 void InitBoa…

提示词工程(Prompt Engineering)

1. Prompt 是什么&#xff1f; Prompt&#xff1a;提示词&#xff0c;是描述 AI 需要执行的任务的自然语言文本。 如上图所示&#xff0c;Prompt就是用户的提问。其实我们大家都用过Prompt&#xff0c;比如我们使用的ChatGPT、文心一言、豆包等AI产品时的提问就是Prompt&…

【Linux】文件操作、系统IO相关操作、inode和输入输出重定向

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1、理解文件1.1 狭义理解1.2 广义理解1.3 文件操作1.4 系统角度 2、系统文件IO2.1 文件相关操作2.2 文件描述符2.3 重定向 3、动静…

开源软件协议介绍

一、可以闭源使用/不具传染性的协议 允许商业使用和分发 1、BSD&#xff1a;详细介绍 2、LGPL许可证&#xff1a;详细介绍 3、MPL2.0&#xff1a;详细介绍 二、具有传染性/使用后需要开源自身软件的协议 不建议商业使用 1、GPL许可证&#xff1a;详细介绍

头像生成小程序搭建(免费分享)

如下图为小程序页面的基本效果&#xff0c;下面将介绍该小程序的功能 页面template代码如下&#xff1a; <template><view class"avatar-containner"><block v-if"!showCropper"><image class"pageback" src"../../s…