Python PyQt实现数据库绑定功能 (pyqt 绑定数据库)

在企业信息化应用中,数据库的使用是不可避免的需求。而在Python中,使用PyQt框架可以很方便地实现数据库绑定功能,简化了开发者的工作,提高开发效率。本文将介绍的实现方法。

一、Python PyQt与数据库

Python PyQt是Python语言的一个GUI编程框架,通过与数据库的结合,能够实现灵活快速的数据管理操作。PyQt可以操作绝大多数的数据库,包括SQLite、MySQL、Oracle等等。

通过使用PyQt实现数据库绑定功能,可以方便地将数据表或视图与控件进行绑定,实现数据的自动更新与显示,这大大减轻了程序员的负担,提高了开发效率。

二、PyQt与SQLite数据库的绑定

在实现数据库绑定功能时,我们首先需要选择合适的数据库。在本文中,我们选择SQLite,这是一个轻量级的数据库,非常适合小型项目的使用。

1. PySQLite模块的安装

首先需要安装PySQLite模块,这个模块提供了Python对SQLite数据库的支持。可以通过pip工具进行安装:

“`python

pip install pysqlite3

“`

安装完成后,我们就可以开始使用这个模块了。

2. 建立SQLite数据库

我们需要在SQLite数据库中创建一张表,来存储将要绑定的数据。以员工信息表为例,表结构如下:

“`SQL

CREATE TABLE employee (

id INTEGER PRIMARY KEY AUTOINCREMENT,

name VARCHAR(20) NOT NULL,

gender VARCHAR(2) NOT NULL,

age INTEGER DEFAULT 0,

department VARCHAR(50) NOT NULL

)

“`

这个表包含了员工的基本信息,包括编号、姓名、性别、年龄和所在部门。

3. 建立PyQt窗口

我们需要创建一个PyQt窗口,用来显示员工信息表中的数据。这个窗口需要包含一个QTableView控件,用来显示表格数据。

“`python

import sys

from PyQt5.QtWidgets import QApplication,QMnWindow,QTableView

from PyQt5.QtSql import QSqlDatabase,QSqlQuery

class MnWindow(QMnWindow):

def __init__(self,parent=None):

super(MnWindow,self).__init__(parent)

self.setWindowTitle(‘Employee Information’)

self.resize(480,280)

self.tableView=QTableView(self)

self.tableView.setGeometry(20,20,440,240)

self.tableView.setSortingEnabled(True)

self.db=QSqlDatabase.addDatabase(‘QSQLITE’)

self.db.setDatabaseName(’employee.db’)

if not self.db.open():

print(self.db.lastError().text())

sys.exit(1)

self.model=QtSql.QSqlTableModel(self,db)

self.model.setTable(’employee’)

self.model.sort(0,QtCore.Qt.DescendingOrder) # 按第0列降序排列

self.model.select()

self.tableView.setModel(self.model)

self.tableView.resizeColumnsToContents() # 自适应列宽

if __name__ == ‘__mn__’:

app=QApplication(sys.argv)

win=MnWindow()

win.show()

sys.exit(app.exec_())

“`

在上面的代码中,我们创建了一个QMnWindow窗口,包含了一个QTableView控件。同时,我们通过QSqlDatabase.addDatabase(‘QSQLITE’)方法创建了一个SQLite数据库,并连接到了名为employee.db的数据库文件。在连接成功后,我们可以通过QSqlQuery对象进行查询和更新数据库。这里的QSqlTableModel控件可以方便地与数据库中的数据表进行绑定。

我们将表格设置为自适应列宽。这样,每个字段的宽度将调整得足够宽,可以容纳数据,增加用户体验。

三、绑定控件与数据库

在上一节中,我们已经实现了创建PyQt窗口和连接SQLite数据库的功能。下一步是实现控件与数据库的绑定,以自动更新数据。

1. 实现数据插入

我们可以使用QSqlQuery对象插入新的员工记录。当我们单击插入按钮时,一个新的员工记录将入到数据库中。同时,表格中的数据也将刷新。

“`python

import sys

from PyQt5.QtWidgets import QApplication,QMnWindow,QWidget,QHBoxLayout,QVBoxLayout,QTableView,QLineEdit,QPushButton

from PyQt5.QtSql import QSqlDatabase,QSqlQuery,QSqlTableModel

class MnWindow(QMnWindow):

def __init__(self,parent=None):

super(MnWindow,self).__init__(parent)

self.setWindowTitle(‘Employee Information’)

self.resize(480,280)

centralWidget=QWidget(self)

self.setCentralWidget(centralWidget)

self.tableView=QTableView(self)

self.tableView.setSortingEnabled(True)

self.db=QSqlDatabase.addDatabase(‘QSQLITE’)

self.db.setDatabaseName(’employee.db’)

if not self.db.open():

print(self.db.lastError().text())

sys.exit(1)

self.model=QSqlTableModel(self,db)

self.model.setTable(’employee’)

self.model.sort(0,QtCore.Qt.DescendingOrder)

self.model.select()

self.tableView.setModel(self.model)

self.tableView.resizeColumnsToContents()

self.nameEdit=QLineEdit(self)

self.genderEdit=QLineEdit(self)

self.ageEdit=QLineEdit(self)

self.departmentEdit=QLineEdit(self)

nameLabel=QLabel(‘Name’,self)

genderLabel=QLabel(‘Gender’,self)

ageLabel=QLabel(‘Age’,self)

departmentLabel=QLabel(‘Department’,self)

insertButton=QPushButton(‘Insert’,self)

insertButton.clicked.connect(self.insertRecord)

hlayout=QHBoxLayout()

vlayout=QVBoxLayout(centralWidget)

vlayout.addWidget(self.tableView)

vlayout.addLayout(hlayout)

hlayout.addWidget(nameLabel)

hlayout.addWidget(self.nameEdit)

hlayout.addWidget(genderLabel)

hlayout.addWidget(self.genderEdit)

hlayout.addWidget(ageLabel)

hlayout.addWidget(self.ageEdit)

hlayout.addWidget(departmentLabel)

hlayout.addWidget(self.departmentEdit)

hlayout.addWidget(insertButton)

def insertRecord(self):

query=QSqlQuery(db)

query.prepare(‘INSERT INTO employee (name,gender,age,department) VALUES (?,?,?,?)’)

query.addBindValue(self.nameEdit.text())

query.addBindValue(self.genderEdit.text())

query.addBindValue(int(self.ageEdit.text()))

query.addBindValue(self.departmentEdit.text())

if not query.exec():

print(query.lastError().text())

self.model.select()

if __name__ == ‘__mn__’:

app=QApplication(sys.argv)

win=MnWindow()

win.show()

sys.exit(app.exec_())

“`

在上面的代码中,我们创建了一个新的QWidget,并在其中添加了四个QLineEdit控件(分别用于输入员工姓名、性别、年龄和所属部门)、一个QPushButton控件(用于插入新的员工记录)。通过调用insertRecord函数,在将所有输入数据绑定到QSqlQuery对象后,将新条目插入到数据库中。

2. 实现数据删除

当我们单击删除按钮时,选择的员工记录将被删除。同时,表格中的数据也将刷新。

“`python

import sys

from PyQt5.QtWidgets import QApplication,QMnWindow,QWidget,QHBoxLayout,QVBoxLayout,QTableView,QLineEdit,QPushButton

from PyQt5.QtSql import QSqlDatabase,QSqlQuery,QSqlTableModel

class MnWindow(QMnWindow):

def __init__(self,parent=None):

super(MnWindow,self).__init__(parent)

self.setWindowTitle(‘Employee Information’)

self.resize(480,280)

centralWidget=QWidget(self)

self.setCentralWidget(centralWidget)

self.tableView=QTableView(self)

self.tableView.setSortingEnabled(True)

self.db=QSqlDatabase.addDatabase(‘QSQLITE’)

self.db.setDatabaseName(’employee.db’)

if not self.db.open():

print(self.db.lastError().text())

sys.exit(1)

self.model=QSqlTableModel(self,db)

self.model.setTable(’employee’)

self.model.sort(0,QtCore.Qt.DescendingOrder)

self.model.select()

self.tableView.setModel(self.model)

self.tableView.resizeColumnsToContents()

self.nameEdit=QLineEdit(self)

self.genderEdit=QLineEdit(self)

self.ageEdit=QLineEdit(self)

self.departmentEdit=QLineEdit(self)

nameLabel=QLabel(‘Name’,self)

genderLabel=QLabel(‘Gender’,self)

ageLabel=QLabel(‘Age’,self)

departmentLabel=QLabel(‘Department’,self)

insertButton=QPushButton(‘Insert’,self)

insertButton.clicked.connect(self.insertRecord)

deleteButton=QPushButton(‘Delete’,self)

deleteButton.clicked.connect(self.deleteRecord)

hlayout=QHBoxLayout()

vlayout=QVBoxLayout(centralWidget)

vlayout.addWidget(self.tableView)

vlayout.addLayout(hlayout)

hlayout.addWidget(nameLabel)

hlayout.addWidget(self.nameEdit)

hlayout.addWidget(genderLabel)

hlayout.addWidget(self.genderEdit)

hlayout.addWidget(ageLabel)

hlayout.addWidget(self.ageEdit)

hlayout.addWidget(departmentLabel)

hlayout.addWidget(self.departmentEdit)

hlayout.addWidget(insertButton)

hlayout.addWidget(deleteButton)

def insertRecord(self):

query=QSqlQuery(db)

query.prepare(‘INSERT INTO employee (name,gender,age,department) VALUES (?,?,?,?)’)

query.addBindValue(self.nameEdit.text())

query.addBindValue(self.genderEdit.text())

query.addBindValue(int(self.ageEdit.text()))

query.addBindValue(self.departmentEdit.text())

if not query.exec():

print(query.lastError().text())

self.model.select()

def deleteRecord(self):

selected=self.tableView.selectedIndexes()

if len(selected)!=1:

return

row=selected[0].row()

self.model.removeRows(row,1)

if __name__ == ‘__mn__’:

app=QApplication(sys.argv)

win=MnWindow()

win.show()

sys.exit(app.exec_())

“`

在上面的代码中,我们创建了一个新的QPushButton控件,用于从数据库中删除所选员工记录。我们使用QTableView.selectedIndexes()方法获取被选中的数据行,然后调用QSqlTableModel.removeRows()方法删除该记录。

相关问题拓展阅读:

用pyqt做好了前端,想用django做服务器,想问一下大概怎么搭建呢?

一般客户端(也就是你说的前段)跟服务器端(你准备使用Django)都是通过 HTTP 协议交换信息的(除纯尘非有特别的需求,才会使用别的或者定制协议)。

在 客户端(PyQT)中,你可以安装 Requests 库,它可以帮助你发送 HTTP 请求给服务器端,

在 Django 中你可以使用燃塌 Django REST Framework

网页链接

处理 客户端做段禅的

HTTP请求

pyqt4pyqt5哪个好用_pyqt5使用

PyQt5不兼容PyQt4(尽管经验表明,将PyQt4的应用程序移植到PyQt5难度不是很大)。本节描述了两者之间的主要差异。

支持Python的版本

不支持较早的Python2.6之前的版本┊。

推荐使用特性

PyQt5不支持任何被标记为过时的或废弃的QTV5.0的API。然而,还是可能有一些“漏网之鱼”。如果将来发现了,这些错误将被删除。

多个API

PyQt4支持许多不同的API版本(QString,QVariant等)。QVariant

PyQt5只支持V2版本的API。一个例外:对于QVariant,去除了。

老式的信号和槽

PyQt4的旧式的信号和槽不再被支持。因此以下用法在PyQt5中已经不能使用:

QObject.connect()

QObject.emit()

SIGNAL()

SLOT()

所有那些含有参数,并且对返回结果调用SIGNAL()或SLOT()的方法不再被支持。绑定信号与调用函数总是等效的。

此外,另一个差异是增加了下面的函数:

disconnect()断开所有对QObject实例的连接,不需要参数。

新风格的信号和槽

QT实现的信号与一个可选的参数作为两个独立的信号,一个与论点和一个没有它。PyQt4暴露这两允许你连接到他们每个。然而,当发射信号,你必须使用适当的参数发出的信号数。

PyQt5暴露唯一的信号在所有指定参数。然而它允许任何可选参数被省略时,发射信号。

不同于PyQt4,PyQt5支持在类中自定义属性、信号与槽,即使这个类没有继承自QObject(比如:混合类)。

,QtScript和模块

PyQt4的,QtScript和模块不再支持。这些已被替换为PyQt5的QtQml和QtQuick模块,PyQt5支持Python对象创建QML。

QtGui模块

PyQt4的QtGui模块,在PyQt5中被拆分成三个模块:QtGui,和QtWidgets。

QtOpenGL模块

只有QGlContext,QGlFormat和QGlWidget类被PyQt5支持。

QtWebKit模块

PyQt4的QtWebKit模块被分成PyQt5的QtWebKit和模块。

pyqtconfig模块

PyQt4的pyqtconfig模块不支持。截面PyQt5扩展的API介绍了支持PyQt5(例如提供第三方包qscintilla),要建立在PyQt5。

dbus.mainloop.qt模块

PyQt4的dbus.mainloop.qt模块称为dbus.mainloop.PyQt5在PyQt5。这使得他们可以并排安装。它们的功能是相同。

QDataStream

的reaint8(),readint8(),writeuint8()和writeint8()方法解释值读写数字。PyQt4中它们被解释为单个字符的字符串。

QFileDialog

PyQt4的QFileDialog类的(),()和()方法,在PyQt5中已更名为(),()和()。

而PyQt4原来的(),()和()不再被PyQt5支持。

QGraphicsItemAnimation

对废弃的QGraphicsItemAnimation类的支持已被删除。如果移植现有的PyQt4应用程序,首先考虑用QPropertyAnimation替换。

QMatrix

对废弃的QMatrix类的支持已被删除。如果移植现有的PyQt4应用程序,首先考虑用QTransform替换。

QPyTextObject

PyQt4的QPyTextObject,是作为一个无法定义一个继承多个Qt类的Python类的变通的解决方法。PyQt5支持定义一个Python类,来继承多个Qt类,只要他们已经在C声明为Q_DECLARE_INTERFACE。所以,QPyTextObject没有在PyQt5中实现。

QSet

PyQt4,套装在Python中的V2和V3一组Python列表实现。在PyQt5套装总是作为一个集实现。

pyuic5

pyuic5不支持pyqt3——包装国旗pyuic4。

pyr5

pyr5不支持-PY2和-PY3国旗pyr4。输出pyr5兼容所有版本的PythonPython2.6入手。

多重继承

不像PyQt4PyQt5类实现多重继承,合作。在其他的话总是做PyQt5类下面的Python代码在等效V3__init__方法(如kwds是一个未使用的关键词参数字典):

super().__init__(**kwds)

这意味着,那些未使用的关键字的参数传递给__init__任何mixin类的方法。这些混合类必须合作,即必须如果他们有自己做一个类似的__init__实现。

当使用多重继承PyQt4是常见的__init__的超类方法明确,例如:

classMyQObject(QObject,MyMixin):

def__init__(self,parent,mixin_arg):

QObject.__init__(self,parent)

MyMixin.__init__(self,mixin_arg)

#Otherinitialisation…

在上述将导致PyQt5mymixin__init__。被称为两。而要实现:

classMyQObject(QObject,MyMixin):

def__init__(self,**kwds):

super().__init__(**kwds)

#Otherinitialisation…

请注意,如果没有其他的初始化做那么__init__方法不需要。

混合类应实施如下:

classMyMixin:

def__init__(self,mixin_arg,**kwds):

super().__init__(**kwds)

#Otherinitialisation…

为什么用pyqt的不多?

大多是因为不会用,他们在自学的时候,找的资料教程一般都是手写的代码,等到他们学会用的时候,就知道是真的好用。

PyQt是一个创建GUI

应用程序

的工具包。它是Python编程语言和Qt库的成功融合。Qt库是目前最强大的库之一。PyQt是由Phil Thompson 开发。

PyQt实现了一个Python模块集。它有超过300类,将近6000个函数和银兄方法。它是一个多平台的工具包,可以运行在所有主要操作系统上,包括UNIX,Windows和Mac。 

PyQt采用双许可证,开发人员可以选择GPL和商业许可。在此之前,GPL的版本只能用在Unix上,从PyQt的版本4开始,GPL许可证可用于所有支持的平台。

因为可用的类有很多,他们被分成几个模块。 QtCore模块包含核心的非GUI功能。该模块用于时间、文件和目录、各种

数据类型

、流、网址、MIME类型、线程或进程。

QtGui模块包含图形组件和相关的类,例如按钮、窗体、状态栏、工具宏缓栏、滚动条、位图、颜色、字体等。

QtNetwork模块包含了网络编程的类,这些类允许编写TCP/IP和UDP的客户端和服务器,他们使网络编程更简单,更轻便。

QtXml包含使用XML文件的类,这个模块提供了SAX和DOM API的实现。QtSvg模块提蔽搏模供显示的SVG文件的类。可缩放矢量图形(SVG)是一种用于描述二维图形和图形应用程序的

XML语言

QtOpenGL模块使用OpenGL库渲染3D和2D图形,该模块能够无缝集成Qt的GUI库和OpenGL库。QtSql模块提供用于数据库的类。

pyqt 绑定数据库的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于pyqt 绑定数据库,Python PyQt实现数据库绑定功能,用pyqt做好了前端,想用django做服务器,想问一下大概怎么搭建呢?,pyqt4pyqt5哪个好用_pyqt5使用,为什么用pyqt的不多?的信息别忘了在本站进行查找喔。


数据运维技术 » Python PyQt实现数据库绑定功能 (pyqt 绑定数据库)