目录
1.用PyQt5Designer设计窗体
各个窗体控件的名字我都写在了下面
主窗体
子窗体
具体设计思路可以看这篇博客:http://t.csdn.cn/9RKqx
2.项目功能及代码
添加
子窗体函数
首先在子窗体定义一个函数,之后用槽函数把添加按钮和自定义函数连接起来。
# 添加图书信息
def insert(self):
# 获取借阅者的姓名并去除前面的空格1
# strip去除开头或结尾的空格
name = self.lineEdit_2.text().strip()
books = self.lineEdit.text().strip()
time1 = self.dateEdit.text()
time2 = self.dateEdit_2.text()
if len(name) <= 0 or len(books) <= 0:
# 如果有一个为空位,提示消息并结束此函数
QMessageBox.information(self, "提示", "家人,咱这输入的不对,要不把空格去掉。", QMessageBox.Ok)
return
# 创建对象并初始化属性
newBook = mybook.Books(name, books, time1, time2)
# 把新学员对象追加到全局的学员列表中
mybook.Book.append(newBook)
# 获取表格控件的行数量
# rowCount获取当前表格部件中的行数
row = self.tableWidget.rowCount()
# 以数量做索引添加一行
# inserter_row用于在表格的指定位置插入一个新行
self.tableWidget.insertRow(row)
# 以借阅者为内容创建表格的一行
item1 = QTableWidgetItem(name)
item1.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 0, item1)
item2 = QTableWidgetItem(books)
item2.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 1, item2)
item3 = QTableWidgetItem(time1)
item3.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 2, item3)
item4 = QTableWidgetItem(time2)
item4.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 3, item4)
# QMessageBox添加对话框
result = QMessageBox.question(self, "消息", "添加成功,是否接着添加", QMessageBox.Yes | QMessageBox.No)
if result == QMessageBox.Yes:
self.lineEdit_2.setText('')
self.lineEdit.setText('')
if result == QMessageBox.No:
self.close()
设置一个保存内容的文档
因为我还没有学习数据库,所以想要保存到表格的内容只能暂时用一个文档储存起来
import os
Book = []
def saveStudents():
current_path = os.getcwd() + "\\Book.txt"
f = open(current_path, "w+")
for item in Book:
f.write(item.name + ' ' + item.books + ' ' + item.time1 + ' ' + item.time2 + '\n')
f.close()
class Books(object):
def __init__(self, name, books, time1, time2):
self.name = name
self.books = books
self.time1 = time1
self.time2 = time2
主窗体函数
首先定义一个打开子窗体的函数
def openmainWindow(self):
# 创建子窗体对象,并传参。
self.child = UiMainwindow(-1, "添加", self.tableWidget)
self.child.setWindowModality(Qt.ApplicationModal)
# 固定子窗体的大小
self.child.setFixedSize(self.child.width(), self.child.height())
# 设置子窗体以模态方式打开
self.child.setWindowModality(Qt.ApplicationModal)
# 展示
self.child.show()
删除
# 删除功能
def deleteStu(self):
# 获取表格控件中的选中行索引
index = self.tableWidget.currentRow()
# 判断是否有选中行
if index < 0:
# 如果没有选中行,提示消息并结束此函数
QMessageBox.information(None, "提示", "请选中删除行", QMessageBox.Ok)
return
# 消息框询问是否继续添加,接收返回值
result = QMessageBox.question(None, "消息", "是否删除选中行?", QMessageBox.Yes | QMessageBox.No)
# 判断返回值是否消息框的No按钮
if result == QMessageBox.Yes:
# 获取表格控件选中行第一列的内容
name = self.tableWidget.selectedItems()[0].text()
# 删除表格控件中索引所在行
self.tableWidget.removeRow(index)
# 循环学员列表
for item in Book:
# 如果学员姓名等于删除行第一列内容
if item.name == name:
# 从学员列表中删除此学员
Book.remove(item)
break
修改
主窗体代码
# 打开修改窗体
def modifyDialogOpen(self):
index = self.tableWidget.currentRow()
# 如果没有选中行
if index < 0:
QMessageBox.information(None, "提示", "请选中修改的信息", QMessageBox.Ok)
return
# 获取表格控件中的行的第一行内容
name = self.tableWidget.selectedItems()[0].text()
# 定义变量保存选中学员列表中的索引
index = 0
# 循环学员列表
for item in Book:
if name == item.name:
break
# 学员列表索引+1
index += 1
# 创建窗口对象并传参
self.child = UiMainwindow(index, "修改", self.tableWidget)
# 设置窗口以应用程序模态打开
self.child.setWindowModality(Qt.ApplicationModal)
# 设置窗口不可调整大小
self.child.setFixedSize(self.child.width(), self.child.height())
self.child.show()
子窗体代码
# 修改信息
def alter(self):
# 获取借阅者的姓名并去除前面的空格
# strip去除开头或结尾的空格
name = self.lineEdit_2.text().strip()
books = self.lineEdit.text().strip()
time1 = self.dateEdit.text()
time2 = self.dateEdit_2.text()
# dateEdit = QDateTimeEdit(QDate.currentDate(), self)
if len(name) <= 0 or len(books) <= 0:
# 如果有一个为空位,提示消息并结束此函数
QMessageBox.information(self, "提示", "家人,咱这输入的不对。", QMessageBox.Ok)
return
# 设置表格控件中选中列的文本文件
self.tableWidget.selectedItems()[0].setText(name)
self.tableWidget.selectedItems()[1].setText(books)
self.tableWidget.selectedItems()[2].setText(time1)
self.tableWidget.selectedItems()[3].setText(time2)
mybook.Book[self.index].name = name
mybook.Book[self.index].books = books
mybook.Book[self.index].time1 = time1
mybook.Book[self.index].time2 = time2
# 关闭
result = QMessageBox.question(self, "消息", "修改成功", QMessageBox.Ok)
if result == QMessageBox.Ok:
self.close()
self.close()
搜索
# 查找功能
def finding(self):
# 获取查询的文本框内容并取消前后空格
name = self.lineEdit.text().strip()
# 判断查询内容是否为空
if len(name) <= 0:
# 如果为空,提示用户
QMessageBox.information(None, "提示", "请输入借阅者姓名", QMessageBox.Ok)
# 结束此函数
return
# 设置表格控件的数据行为0
self.tableWidget.setRowCount(0)
# 清空表格控件的内容,与上面一行共同使用清空所有行
self.tableWidget.clearContents()
# 循环学员列表,重新加载学员信息显示在表格控件
for item in Book:
if name == item.name:
# 获取表格控件的行数
row = self.tableWidget.rowCount()
# 根据行数做索引添加一行
self.tableWidget.insertRow(row)
# 创建列对象,内容是学员名称
item1 = QTableWidgetItem(item.name)
# 水平垂直方向居中
item1.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
# 把新建的列对象设置在表格控件索引row所在行,索引0所在列
self.tableWidget.setItem(row, 0, item1)
item2 = QTableWidgetItem(item.books)
item2.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
# 把新建的列对象设置在表格控件索引row所在行,索引1
self.tableWidget.setItem(row, 1, item2)
item3 = QTableWidgetItem(item.time1)
item3.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
# 把新建的列对象设置在表格控件索引row所在行,索引2所在列
self.tableWidget.setItem(row, 2, item3)
item4 = QTableWidgetItem(item.time2)
item4.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
# 把新建的列对象设置在表格控件索引row所在行,索引3 所在列
self.tableWidget.setItem(row, 3, item4)
break
搜索借阅者的名字,可以搜索到想要的同学
菜单
点击鼠标右键,可弹出添加、删除。修改。三个基本功能,另外我又添加了返回功能,是在搜索之后点击菜单返回表格全部内容。
# 弹出菜单
def rightShowMenu(self):
rightMenu = QMenu()
menu1 = rightMenu.addAction("添加")
menu1.triggered.connect(self.openmainWindow)
menu2 = rightMenu.addAction("修改")
menu2.triggered.connect(self.modifyDialogOpen)
menu3 = rightMenu.addAction("删除")
menu3.triggered.connect(self.deleteStu)
menu4 = rightMenu.addAction("返回")
menu4.triggered.connect(self.back)
rightMenu.show()
rightMenu.exec_(QCursor.pos())
返回功能很简单,先把表格当前内容删除,然后重新加载全部内容。
# 显示——学员信息显示在 tableWidget 中
def back(self):
# 设置表格控件的数据行为0
self.tableWidget.setRowCount(0)
# 清空表格控件的内容,与上面一行共同使用清空所有行
self.tableWidget.clearContents()
# 循环学员信息列表
for item in Book:
# 获取表格控件的行数
row = self.tableWidget.rowCount()
self.tableWidget.insertRow(row)
item1 = QTableWidgetItem(item.name)
item1.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 0, item1)
item2 = QTableWidgetItem(item.books)
item2.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 1, item2)
item3 = QTableWidgetItem(item.time1)
item3.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 2, item3)
item4 = QTableWidgetItem(item.time2)
item4.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 3, item4)
其他
主窗体
# 学员信息显示到table控件里
def loadTable(self):
# 循环学员信息列表
for item in Book:
# 获取表格控件的行数
row = self.tableWidget.rowCount()
# 根据行数做索引添加一列
self.tableWidget.insertRow(row)
# 创建列对象
item1 = QTableWidgetItem(item.name)
item1.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 0, item1)
item2 = QTableWidgetItem(item.books)
item2.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 1, item2)
item3 = QTableWidgetItem(item.time1)
item3.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 2, item3)
item4 = QTableWidgetItem(item.time2)
item4.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.tableWidget.setItem(row, 3, item4)
子窗体
def insert_expurgate(self):
# 判断标题来进行修改或添加
if self.title == "添加":
self.insert()
else:
self.alter()
# 窗体加载时调用
def myInitWindow(self):
# 单击保存按钮调用函数
self.OK.clicked.connect(self.insert_expurgate)
# 如果标题是修改
if self.title == "修改":
self.lineEdit_2.setText(self.tableWidget.selectedItems()[0].text())
self.lineEdit.setText(self.tableWidget.selectedItems()[1].text()
self.dateEdit.setDate(QDate.currentDate())
self.dateEdit_2.setDate(QDate.currentDate().addDays(30))
窗口开始界面
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from untitled1 import *
class ManagerWindow(QMainWindow):
def closeEvent(self, event):
result = QtWidgets.QMessageBox.question(self, "退出", "是否保存后退出?",
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
if result == QtWidgets.QMessageBox.Yes:
saveStudents()
# 执行关闭功能
event.accept()
# 程序入口
if __name__ == '__main__': # python模拟程序入口
# 创建主窗体
app = QApplication(sys.argv)
# 设计的UI界面实体化
ui = Ui_Dialog()
# 创建主窗体对象,一个应用程序可以有多个窗体,但是一个窗体不能代表一个应用程序。
MainWindow = ManagerWindow()
# 把所有用到的控件化在主窗体上。
ui.setupUi(MainWindow)
# 设置窗体大小不能更改
MainWindow.setFixedSize(MainWindow.width(), MainWindow.height())
# 主窗体自己的宽 #主窗体自己的高
# 显示主窗体
MainWindow.show()
sys.exit(app.exec_())
3.几个优化项目界面的功能
QMessageBox函数
大家可能好奇QMessageBox函数,它的功能是产生一个提示框,在报错或者删除时弹出来提示。
result = QMessageBox.question(self, "消息", "添加成功,是否接着添加",
QMessageBox.Yes | QMessageBox.No)
QMessageBox.information(self, "提示", "家人,咱这输入的不对,要不把空格去掉。", QMessageBox.Ok)
设置背景图片
# 设置窗体背景图片
palette = QPalette()
pix = QPixmap("项目图片/feb1fe93862d873eacf66dd4d82d307e.jpg")
# # 自调背景图大小和窗体适应
pix = pix.scaled(mainWindow.width(), mainWindow.height())
palette.setBrush(QPalette.Background, QBrush(pix))
mainWindow.setPalette(palette)
对提示栏进行设置
# 设置搜索栏提示信息
self.lineEdit.setPlaceholderText('请输入要查询的学生姓名……')
对控件设置透明化
# 控件半透明设置
op = QtWidgets.QGraphicsOpacityEffect()
# 0.7是控件的半透明程度
op.setOpacity(0.7)
self.lineEdit.setGraphicsEffect(op)
self.lineEdit.setAutoFillBackground(True)
日期控件
这个代码可以让日期控件上显示当前日期
self.dateEdit.setDate(QDate.currentDate())
# addDays是在原基础上增加的天数
self.dateEdit_2.setDate(QDate.currentDate().addDays(30))
需要原码的可以到下面链接下载:
如果下载不了可以后台私信我,好本篇博客内容就到这里感谢您的观看,如果对您有帮助的话请留下你的赞。