QTableView 是QT的一个强大的表视图部件,可以与模型结合使用以显示和编辑数据。QSqlQueryModel、QSqlTableModel 都是用于与 SQL 数据库交互的模型,将二者与QTableView结合使用可以轻松地展示和编辑数据库的数据。
QSqlQueryModel的简单应用
python
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的简单应用
python
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的另一个范例
这个范例中设置了筛选条件,只显示符合条件的部分数据
python
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的另一个范例
这个范例中同样设置了筛选条件,只显示符合条件的部分数据
python
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()