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.db
    db.setDatabaseName('example.db')
    # 尝试打开数据库连接
    if not db.open():
        # 如果打开失败,打印错误信息并返回False
        print("Unable to open database")
        return False
    # 如果打开成功,返回True
    return True

def 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():
        # 如果打开失败,打印错误信息并返回False
        print("Unable to open database")
        return False
    # 如果打开成功,返回True
    return 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, QSqlQuery

db = 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 的模型/视图架构无缝集成。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek学术题目选择效果怎么样?

论文选题 一篇出色的论文背后,必定有一个“智慧的选题”在撑腰。选题足够好文章就能顺利登上高水平期刊;选题不行再精彩的写作也只能“当花瓶”。然而许多宝子们常常忽视这个环节,把大量时间花在写作上,选题时却像抓阄一样随便挑一…

Linux的权限和一些shell原理

目录 shell的原理 Linux权限 sudo命令提权 权限 文件的属性 ⽂件类型: 基本权限: chmod改权限 umask chown 该拥有者 chgrp 改所属组 最后: 目录权限 粘滞位 shell的原理 我们广义上的Linux系统 Linux内核Linux外壳 Linux严格…

【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(一)

目录 1 -> 概述 1.1 -> 整体架构 2 -> 文件组织 2.1 -> 目录结构 2.2 -> 文件访问规则 2.3 -> 媒体文件格式 3 -> js标签配置 3.1 -> pages 3.2 -> window 3.3 -> 示例 4 -> app.js 4.1 -> 应用生命周期 4.2 -> 应用对象6…

计算机的错误计算(二百二十二)

摘要 利用大模型化简计算 实验表明,虽然结果正确,但是,大模型既绕了弯路,又有数值计算错误。 与前面相同,再利用同一个算式看看另外一个大模型的化简与计算能力。 例1. 化简计算摘要中算式。 下面是与一个大模型的…

Ubuntu介绍、与centos的区别、基于VMware安装Ubuntu Server 22.04、配置远程连接、安装jdk+Tomcat

目录 ?编辑 一、Ubuntu22.04介绍 二、Ubuntu与Centos的区别 三、基于VMware安装Ubuntu Server 22.04 下载 VMware安装 1.创建新的虚拟机 2.选择类型配置 3.虚拟机硬件兼容性 4.安装客户机操作系统 5.选择客户机操作系统 6.命名虚拟机 7.处理器配置 8.虚拟机内存…

基于单片机的智能小区门禁系统设计(论文+源码)

1总体架构 智能小区门禁系统以STM32单片机和WiFi技术为核心,STM32单片机作为主控单元,通过WiFi模块实现与手机APP的连接,构建整个门禁系统。系统硬件包括RFID模块、指纹识别模块、显示屏、按键以及继电器。通过RFID绑定IC卡、APP面部识别、指…

03_使用同一个函数创建不同的任务

一、声明 这个程序执行的任务就是在一个函数里面可以执行几个不同的任务(好吧,我到现在也没学会怎么添加自己的视频) 我们这个程序使用到的外设只有OLED屏幕 二、CubeMx的配置 注意要选一下TIM4 挂一个I2C,用来放OLED的屏幕 再开…

高频 SQL 50 题(基础版)_620. 有趣的电影

高频 SQL 50 题(基础版)_620. 有趣的电影 一级目录 表:cinema id 是该表的主键(具有唯一值的列)。 每行包含有关电影名称、类型和评级的信息。 评级为 [0,10] 范围内的小数点后 2 位浮点数。 编写解决方案,找出所有影片描述为 …

iOS开发设计模式篇第二篇MVVM设计模式

目录 一、什么是MVVM 二、MVVM 的主要特点 三、MVVM 的架构图 四、MVVM 与其他模式的对比 五、如何在iOS中实现MVVM 1.Model 2.ViewModel 3.View (ViewController) 4.双向绑定 5.文中完整的代码地址 六、MVVM 的优缺点 1.优点 2.缺点 七、MVVM 的应用场景 八、结…

PyCharm接入DeepSeek实现AI编程

目录 效果演示 创建API key 在PyCharm中下载CodeGPT插件 配置Continue DeepSeek 是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的 AI 模型。DeepSeek-V3 是 DeepSeek 公司推出的最新一代 AI 模型。其前身是 DeepSeek-V2.5,经过持续的…

基于自然语言处理的垃圾短信识别系统

基于自然语言处理的垃圾短信识别系统 🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 目录 设计题目设计目的设计任务描述设计要求输入和输出…

类和对象(4)——多态:方法重写与动态绑定、向上转型和向下转型、多态的实现条件

目录 1. 向上转型和向下转型 1.1 向上转型 1.2 向下转型 1.3 instanceof关键字 2. 重写(overidde) 2.1 方法重写的规则 2.1.1 基础规则 2.1.2 深层规则 2.2 三种不能重写的方法 final修饰 private修饰 static修饰 3. 动态绑定 3.1 动态绑…

JavaScript使用toFixed保留一位小数的踩坑记录:TypeError: xxx.toFixed is not a function

JavaScript的toFixed函数是用于将一个数字格式化为指定的小数位数的字符串。其语法如下: numObj.toFixed([digits]) 其中,numObj是需要格式化的数字,digits是保留的小数位数。digits参数是一个可选参数,默认值为0,表示不保留小数位。 计算后需要保留一位小数,于是使用…

网络仿真工具Core环境搭建

目录 安装依赖包 源码下载 Core安装 FAQ 下载源码TLS出错误 问题 解决方案 找不到dbus-launch 问题 解决方案 安装依赖包 调用以下命令安装依赖包 apt-get install -y ca-certificates git sudo wget tzdata libpcap-dev libpcre3-dev \ libprotobuf-dev libxml2-de…

深入 Rollup:从入门到精通(三)Rollup CLI命令行实战

准备阶段:初始化项目 初始化项目,这里使用的是pnpm,也可以使用yarn或者npm # npm npm init -y # yarn yarn init -y # pnpm pnpm init安装rollup # npm npm install rollup -D # yarn yarn add rollup -D # pnpm pnpm install rollup -D在…

volatile之四类内存屏障指令 内存屏障 面试重点 底层源码

目录 volatile 两大特性 可见性 有序性 总结 什么是内存屏障 四个 CPU 指令 四大屏障 重排 重排的类型 为什么会有重排? 线程中的重排和可见性问题 如何防止重排引发的问题? 总结 happens-before 和 volatile 变量规则 内存屏障指令 写操作…

力扣算法题——11.盛最多水的容器

目录 💕1.题目 💕2.解析思路 本题思路总览 借助双指针探索规律 从规律到代码实现的转化 双指针的具体实现 代码整体流程 💕3.代码实现 💕4.完结 二十七步也能走完逆流河吗 💕1.题目 💕2.解析思路…

RK3568 adb使用

文章目录 一、adb介绍**ADB 主要功能****常用 ADB 命令****如何使用 ADB****总结** 二、Linux下载adb**方法 1:使用包管理器(适用于 Ubuntu/Debian 系统)****方法 2:通过 Snap 安装(适用于支持 Snap 的系统&#xff09…

【ES实战】治理项之索引模板相关治理

索引模板治理 文章目录 索引模板治理问题现象分析思路操作步骤问题程序化方案索引与索引模板增加分片数校验管理 彩蛋如何查询Flink on Yarn 模式下的Task Manager日志相关配置查询已停止的Flink任务查询未停止的Flink任务 问题现象 在集群索引新建时,索引的分片比…

网络工程师 (2)计算机体系结构

一、冯诺依曼体系结构 (一)简介 冯诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同。数学…