一:环境搭建
首先本地需要安装python,PyQt5环境,我是用pip安装的
python -m pip install PyQt5 或者 pip install PyQt5
python -m pip install PyQt5-tools 或者 pip install PyQt5-tools
如果网络不好,还可以使用其他源
pip install PyQt5-tools -i https://pypi.douban.com/simple
安装连接mysql的扩展,我这里使用pymysql
pip install pymysql
至此,开发所需要的扩展已经准备完毕,下面进入开发
二:开发
(一)首先是整个页面的布局,我们定义一个网格QGridLayout,在里面放用户操作按钮和展示用户数据的表格,部分代码如下:
grid_layout = QGridLayout()
grid_layout.setSpacing(10) # 设置布局组件间距
grid_layout.setContentsMargins(20, 20, 20, 20) # 设置布局边距
button_layout = QHBoxLayout()
button_layout.addWidget(self.query_rating_btn)
button_layout.addWidget(self.update_rating_btn)
button_layout.addWidget(self.delte_rating_btn)
#增加用户按钮集合
user_button_layout = QHBoxLayout()
user_button_layout.addWidget(self.refresh_btn)
user_button_layout.addWidget(self.user_add_btn)
#布局按钮的位置
grid_layout.addLayout(button_layout, 2, 0, 1, 4)
grid_layout.addLayout(user_button_layout, 1, 8, 1, 2)
#展示用户数据的标题
header = list(df.columns)
self.model.setColumnCount(len(header))
self.model.setHorizontalHeaderLabels(header)
呈现页面如下:
(二)页面布局出来以后,下一步我们就是连接mysql进行数据的处理
我们先实现刷新功能,部分代码如下:
首先要清空view,获取数据以后重新更新view
#清空view
self.model.removeRows(0,self.model.rowCount())
#获取数据
sql_query = "SELECT id,name,sex,age,address,height FROM b_user"
cursor.execute(sql_query)
result = cursor.fetchall()
if result:
for row in result:
id = QStandardItem(str(row[0]))
name = QStandardItem(str(row[1]))
sex = QStandardItem(str(row[2]))
age = QStandardItem(str(row[3]))
address = QStandardItem(str(row[4]))
height = QStandardItem(str(row[5]))
record = [id, name,sex,age,address,height]
self.model.appendRow(record)
#更新view
self.view.setModel(self.model)
self.view.update()
这样点击刷新按钮,会渲染数据到view中,实现的效果如下:
(三)查询功能实现以后,我们开始添加数据到数据库,实现新增按钮的逻辑,这里点击新增按钮弹出一个对话框,然后填写数据,保存到数据库,部分代码如下:
#初始化新增对话框
class AddDataDialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("新增用户数据")
self.setGeometry(300, 300, 300, 200)
self.layout = QVBoxLayout()
self.setLayout(self.layout)
self.name = QLineEdit() # 添加文本框,
self.name.setPlaceholderText("姓名")
self.sex = QLineEdit() # 添加文本框,
self.sex.setPlaceholderText("性别")
self.address = QLineEdit() # 添加文本框
self.address.setPlaceholderText("地址")
self.height = QLineEdit() # 添加文本框
self.height.setPlaceholderText("身高")
#保存到数据库
try:
with connection.cursor() as cursor:
sql_check = "SELECT COUNT(*) FROM b_user WHERE name = %s"
cursor.execute(sql_check, (name,))
result = cursor.fetchone()
if result[0] > 0:
QMessageBox.warning(self, "警告", "用户已经存在!")
else:
# 插入新记录到表table1
sql_insert = "INSERT INTO b_user (name, sex,age,height,address) VALUES (%s, %s,%s, %s,%s)"
cursor.execute(sql_insert, (name, sex,age,height,address))
connection.commit()
QMessageBox.information(self, "成功", "结果已保存到数据库中!")
finally:
connection.close()
self.connection = None
实现的效果图如下:
(四)新增实现以后,我们要编辑用户数据怎么办呢,可以在每行的数据后面增加编辑按钮
我们需要在渲染数据的时候增加一个编辑按钮,点击以后弹出编辑对话框,带入该行的数据,部分代码实现
#每行数据增加编辑
edit_button_item = ButtonItem("编辑") # 创建按钮项并设置点击事件回调
record = [id, name,sex,age,address,height,edit_button_item]
self.model.appendRow(record)
#编辑对话框
class EditDataDialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("编辑用户数据")
self.setGeometry(300, 300, 300, 200)
self.layout = QGridLayout()
self.setLayout(self.layout)
#添加文本框
self.name = QLineEdit() #
self.sex = QLineEdit()
self.address = QLineEdit()
self.height = QLineEdit()
self.age = QLineEdit()
self.id = QLineEdit()
self.id.setVisible(False)
#设置对话框的数据
def set_text(self,arr):
self.id.setText(arr[0])
self.name.setText(arr[1])
self.sex.setText(arr[2])
self.address.setText(arr[4])
self.height.setText(arr[5])
self.age.setText(arr[3])
#更新到数据库
try:
with connection.cursor() as cursor:
sql_update = "UPDATE b_user SET name = %s,sex = %s,age = %s,height = %s,address = %s WHERE id = %s"
cursor.execute(sql_update, (name, sex, age, height, address, id))
connection.commit()
QMessageBox.information(self, "成功", "记录已更新!")
finally:
connection.close()
self.refresh_user()
dialog.deleteLater() # 释放对话框资源
实现的效果图如下:
(五)最后我们实现删除功能,同样和编辑一样,在每一行增加删除按钮,点击弹窗确认删除弹框,确认以后删除
model = self.model()
if model is not None:
id = model.item(row, 0).text()
reply = QMessageBox.question(self, "确认",
"确定删除数据吗?",
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
current_row = self.currentIndex().row()
self.model().removeRow(current_row)
self.del_data(id)
效果图如下:
至此我们的用户管理查询,增加,修改,和删除已经实现,这里只是实现了基本功能,没有涉及数据的校验和页面交互的优化,后续我会持续优化代码,持续更新功能。