本节分为两个部分:整合管理员界面、所有书籍查询界面设计。
主要流程:1、使用所有书籍查询界面,可以查询数据库内所有书籍的书名、书号、作者等相关信息。
2、可以通过书籍分类进行查询,同时可以进行翻页操作和页数输入跳转操作。
3、也可使用模糊查询,输入关键字,返回和关键字相关的书籍信息。
4、整合所有管理员页面的模块,进入管理员界面后显示所有书籍查询界面及其他功能。
一、所有书籍查询界面
导入的模块:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt
import qdarkstyle
from PyQt5.QtSql import *
(一)类基础设置
- 除了类的设置之外,还要设置一些初始化参数数值
class BookStorageViewer(QWidget):
def __init__(self):
super(BookStorageViewer, self).__init__()
self.resize(1300, 500)
self.setWindowTitle("欢迎使用图书馆管理系统")
# 查询模型
self.queryModel = None
# 数据表
self.tableView = None
# 当前页
self.currentPage = 0
# 总页数
self.totalPage = 0
# 总记录数
self.totalRecord = 0
# 每页数据数
self.pageRecord = 10
self.setUpUI()
(二)所有书籍查询界面设计
- 调用主函数,实例化水平布局控件类型
def setUpUI(self):
self.Vlayout = QVBoxLayout()
self.Hlayout_top = QHBoxLayout()
self.Hlayout_bottom = QHBoxLayout()
1、垂直布局——表头部分
-
self.Hlayout_top
- 水平布局
(1)查询框设置
- 设置输入框的高度、字体大小
self.searchEdit = QLineEdit()
self.searchEdit.setFixedHeight(32)
font = QFont()
font.setPixelSize(15)
self.searchEdit.setFont(font)
(2) 设置查询按钮
- 设置按钮、高度、字体大小、图标样式
self.searchButton = QPushButton("查询")
self.searchButton.setFixedHeight(32)
self.searchButton.setFont(font)
self.searchButton.setIcon(QIcon(QPixmap("./images/search.png")))
(3)设置选项输入框
- 设置成可选型输入框,可以根据分类进行搜索。
self.condisionComboBox = QComboBox()
searchCondision = ['按书名查询', '按书号查询', '按作者查询', '按分类查询', '按出版社查询']
self.condisionComboBox.setFixedHeight(32)
self.condisionComboBox.setFont(font)
self.condisionComboBox.addItems(searchCondision)
(4)在水平布局中添加查询输入框、查询按钮、选项输入框
self.Hlayout_top.addWidget(self.searchEdit)
self.Hlayout_top.addWidget(self.searchButton)
self.Hlayout_top.addWidget(self.condisionComboBox)
- 表头效果展示
2、垂直布局——结尾部分
-
Hlayout = QHBoxLayout()
(1)设置标签“跳转到第”
self.jumpToLabel = QLabel("跳转到第")
(2)设置输入框
self.pageEdit = QLineEdit()
self.pageEdit.setFixedWidth(30)
(3)设置标签“/*页”
s = "/" + str(self.totalPage) + "页"
self.pageLabel = QLabel(s)
(4)设置按钮“跳转”
self.jumpToButton = QPushButton("跳转")
(5)设置标签“前一页”
self.prevButton = QPushButton("前一页")
self.prevButton.setFixedWidth(60)
(6)设置标签“后一页”
self.backButton = QPushButton("后一页")
self.backButton.setFixedWidth(60)
(7)在水平布局中添加以上内容
Hlayout = QHBoxLayout()
Hlayout.addWidget(self.jumpToLabel)
Hlayout.addWidget(self.pageEdit)
Hlayout.addWidget(self.pageLabel)
Hlayout.addWidget(self.jumpToButton)
Hlayout.addWidget(self.prevButton)
Hlayout.addWidget(self.backButton)
widget = QWidget()
widget.setLayout(Hlayout)
widget.setFixedWidth(500)
self.Hlayout_bottom.addWidget(widget)
- 结尾效果展示
3、垂直布局——中间表格部分
- 设置表格
- 此表格需要从数据库进行读取自动返回显示在表内
- 需要用到两个模型:表格模型QTableView()、数据库查询模型QSqlQueryModel()
(1)连接数据库
self.db = QSqlDatabase.addDatabase("QSQLITE")
self.db.setDatabaseName('./db/LibraryManagement.db')
self.db.open()
(2)设置QTableView()表格模型
# 设置QT表格的宽度自适应 horizontalHeader() 宽度自适应内容宽度以及填充整个表格
self.tableView.horizontalHeader().setStretchLastSection(True)
# 自动填充
self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
# 表格内容不能修改
self.tableView.setEditTriggers(QAbstractItemView.NoEditTriggers)
(3)设置QSqlQueryModel()数据库查询模型
- self.searchButtonClicked()
- 调用查询函数
self.queryModel = QSqlQueryModel()
self.searchButtonClicked()
self.tableView.setModel(self.queryModel)
(4)设置列标题
self.queryModel.setHeaderData(0, Qt.Horizontal, "书名")
self.queryModel.setHeaderData(1, Qt.Horizontal, "书号")
self.queryModel.setHeaderData(2, Qt.Horizontal, "作者")
self.queryModel.setHeaderData(3, Qt.Horizontal, "分类")
self.queryModel.setHeaderData(4, Qt.Horizontal, "出版社")
self.queryModel.setHeaderData(5, Qt.Horizontal, "出版时间")
self.queryModel.setHeaderData(6, Qt.Horizontal, "库存")
self.queryModel.setHeaderData(7, Qt.Horizontal, "剩余可借")
self.queryModel.setHeaderData(8, Qt.Horizontal, "总借阅次数")
- 表格部分效果展示
4、设置总布局
- 将三个部分布局依次添加进垂直布局中
- 再将整个垂直布局放在窗口中
self.Vlayout.addLayout(self.Hlayout_top)
self.Vlayout.addWidget(self.tableView)
self.Vlayout.addLayout(self.Hlayout_bottom)
self.setLayout(self.Vlayout)
- 所有书籍查询界面整体效果展示
(三)信号传递
- 绑定信号
self.searchButton.clicked.connect(self.searchButtonClicked)
self.prevButton.clicked.connect(self.prevButtonClicked)
self.backButton.clicked.connect(self.backButtonClicked)
self.jumpToButton.clicked.connect(self.jumpToButtonClicked)
self.searchEdit.returnPressed.connect(self.searchButtonClicked)
1、发送信号一
- 信号一有两个事件类型:鼠标点击和回车键
-
self.searchButton.clicked.connect(self.searchButtonClicked)
- self.searchEdit.returnPressed.connect(self.searchButtonClicked)
- 触发后调用数据库信息搜索函数(查询函数)
(1)查询函数
def searchButtonClicked(self):
self.currentPage = 1
# 获取用户输入跳转的文本,将第一页设置为初始化页数
self.pageEdit.setText(str(self.currentPage))
self.getPageCount()
s = "/" + str(int(self.totalPage)) + "页"
self.pageLabel.setText(s)
index = (self.currentPage - 1) * self.pageRecord
self.recordQuery(index)
return
- 通过调用计算总页数函数来获取页面所要显示的页数及信息
- self.getPageCount()
def getPageCount(self):
self.getTotalRecordCount()
# 上取整,如num=(40+10-1)/10就是4页,num=(41+10-1)/10就是5页
# totalRecord查询得到的记录数(根据条件得到部分和总数),pageRecord是一个类常量
self.totalPage = int((self.totalRecord + self.pageRecord - 1) / self.pageRecord)
return
-
- 若想得到页数信息则还需获取数据库相对应的信息总行数
-
def getTotalRecordCount(self): # 从book表单里查询总的行数 self.queryModel.setQuery("SELECT * FROM Book") # 总记录数等于 模型查询到的所有行数信息 self.totalRecord = self.queryModel.rowCount() return
(2)具体分页查询函数
- self.recordQuery(index)
-
分页记录查询,根据条件得到记录数量,以便分布展示。
查看代码
def recordQuery(self, index):
# 1.选定查询书籍的类型。
# 匹配类型字段,用于sql语句进行数据库信息类型的查询
conditionOrCategory = self.condisionComboBox.currentText()
condition = {
'BookName': "按书名查询",
'BookId': "按书号查询",
'Auth': "按作者查询",
'Category': '按分类查询',
'Publisher': '按出版社查询'
}
for k, v in condition.items():
if conditionOrCategory == v:
conditionOrCategory = k
# 2.根据模糊查询条件,得到记录的信息,最后获取查询记录的行数
temp = self.searchEdit.text()
s = '%'
for i in range(0, len(temp)):
s = s + temp[i] + "%"
# 下面语法为查询字段为conditionOrCategory的记录,并按字段conditionOrCategory排序,
# 该字段里面匹配 "%str1%str2%……“这样的文本信息
queryCondition = ("SELECT * FROM Book WHERE %s LIKE '%s' ORDER BY %s " % (
conditionOrCategory, s, conditionOrCategory))
self.queryModel.setQuery(queryCondition)
# 得到查询到的记录数量
self.totalRecord = self.queryModel.rowCount()
# 3.当查询无记录时提醒,再次刷新下面状态栏的记录数
if self.totalRecord == 0:
print(QMessageBox.information(self, "提醒", "查询无记录"))
# 重新查询所有书籍,显示在界面中。
queryCondition = "select * from Book"
self.queryModel.setQuery(queryCondition)
self.totalRecord = self.queryModel.rowCount()
self.totalPage = int((self.totalRecord + self.pageRecord - 1) / self.pageRecord)
label = "/" + str(int(self.totalPage)) + "页"
self.pageLabel.setText(label)
# 下面语句加了字段排序,然后限定从第几条开始查,查10条
queryCondition = (
"select * from Book ORDER BY %s limit %d,%d "
% (conditionOrCategory, index, self.pageRecord))
self.queryModel.setQuery(queryCondition)
self.setButtonStatus()
return
# 4.若查询有记录信息时。
# 总页数 = int(总记录数 + 每页数据数 -1 )/ 每页数据数
self.totalPage = int((self.totalRecord + self.pageRecord - 1) / self.pageRecord)
label = "/" + str(int(self.totalPage)) + "页"
self.pageLabel.setText(label)
queryCondition = ("SELECT * FROM Book WHERE %s LIKE '%s' ORDER BY %s LIMIT %d,%d " % (
conditionOrCategory, s, conditionOrCategory, index, self.pageRecord))
self.queryModel.setQuery(queryCondition)
self.setButtonStatus()
return
- 页面展示时,要根据输入框内的页数,前一页和后一页的状态,进行翻页设置
- self.setButtonStatus()
def setButtonStatus(self):
if self.currentPage == self.totalPage:
self.prevButton.setEnabled(True)
self.backButton.setEnabled(False)
if self.currentPage == 1:
self.prevButton.setEnabled(False)
self.backButton.setEnabled(True)
if self.totalPage > self.currentPage > 1:
self.prevButton.setEnabled(True)
self.backButton.setEnabled(True)
2、发送信号二
- self.prevButton.clicked.connect(self.prevButtonClicked)
- 向前翻页(前一页)
def prevButtonClicked(self):
self.currentPage -= 1
if self.currentPage <= 1:
self.currentPage = 1
self.pageEdit.setText(str(self.currentPage))
index = (self.currentPage - 1) * self.pageRecord
self.recordQuery(index)
return
- 翻页后重新进行分页查询,根据新的条件得到记录数量,进行分布展示。
- self.recordQuery(index)
- 具体代码见信号一里的(2)具体分页查询函数
3、发送信号三
- self.backButton.clicked.connect(self.backButtonClicked)
- 向后翻页(后一页)
def backButtonClicked(self):
self.currentPage += 1
if self.currentPage >= int(self.totalPage):
self.currentPage = int(self.totalPage)
self.pageEdit.setText(str(self.currentPage))
index = (self.currentPage - 1) * self.pageRecord
self.recordQuery(index)
return
- 翻页后重新进行分页查询,根据新的条件得到记录数量,进行分布展示。
- self.recordQuery(index)
- 具体代码见信号一里的(2)具体分页查询函数
4、发送信号四
- self.jumpToButton.clicked.connect(self.jumpToButtonClicked)
- 根据页数输入框内的数字,进行指定跳转翻页处理
def jumpToButtonClicked(self):
# 判断输入框内是否是数字
if self.pageEdit.text().isdigit():
self.currentPage = int(self.pageEdit.text())
if self.currentPage > self.totalPage:
self.currentPage = self.totalPage
if self.currentPage <= 1:
self.currentPage = 1
else:
self.currentPage = 1
index = (self.currentPage - 1) * self.pageRecord
self.pageEdit.setText(str(self.currentPage))
self.recordQuery(index)
return
- 同上,翻页后重新进行分页查询,根据新的条件得到记录数量,进行分布展示。
- self.recordQuery(index)
- 具体代码见信号一里的(2)具体分页查询函数
(四)函数逻辑解析图
(五)程序入口
if __name__ == "__main__":
app = QApplication(sys.argv)
app.setWindowIcon(QIcon("./images/MainWindow_1.png"))
app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
mainWindow = BookStorageViewer()
mainWindow.show()
sys.exit(app.exec_())
二、管理员界面
导入的模块:
import sys
from PyQt5.QtWidgets import *
import qdarkstyle
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtSql import *
from addBookDialog import addBookDialog
from dropBookDialog import dropBookDialog
from UserMange import UserManage
from BookStorageViewer import BookStorageViewer
(一)类基础设置
class AdminHome(QWidget):
def __init__(self):
super(AdminHome, self).__init__()
self.setUpUi()
def setUpUi(self):
self.resize(900,600)
self.setWindowTitle("欢迎进入管理员主页")
self.layout = QHBoxLayout()
self.buttonlayout = QVBoxLayout()
self.setLayout(self.layout)
(二)管理员页面布局
1、设置标签、标签字体大小、标签宽高
font = QFont()
font.setPixelSize(16)
self.userManageButton = QPushButton("用户管理")
self.addBookButton = QPushButton("添加书籍")
self.dropBookButton = QPushButton("淘汰书籍")
self.userManageButton.setFont(font)
self.addBookButton.setFont(font)
self.dropBookButton.setFont(font)
self.userManageButton.setFixedWidth(100)
self.userManageButton.setFixedHeight(42)
self.addBookButton.setFixedWidth(100)
self.addBookButton.setFixedHeight(42)
self.dropBookButton.setFixedWidth(100)
self.dropBookButton.setFixedHeight(42)
2、添加按钮进入垂直布局
# 将三个按钮添加到垂直布局中
self.buttonlayout.addWidget(self.addBookButton)
self.buttonlayout.addWidget(self.userManageButton)
self.buttonlayout.addWidget(self.dropBookButton)
# 将按钮布局添加到整体垂直布局中
self.layout.addLayout(self.buttonlayout)
3、添加查询所有书籍模块
- 将所有书籍界面直接添加进管理员界面。
self.storageView = BookStorageViewer()
self.layout.addWidget(self.storageView)
(三)信号传递
self.addBookButton.clicked.connect(self.addBookButtonClicked)
self.dropBookButton.clicked.connect(self.dropBookButtonClicked)
self.userManageButton.clicked.connect(self.usermangeClicked)
1、信号一
- self.addBookButton.clicked.connect(self.addBookButtonClicked)
- 点击添加书籍按钮,调用添加书籍模块
def addBookButtonClicked(self):
addDialog = addBookDialog()
addDialog.show()
addDialog.exec_()
2、信号二
- self.dropBookButton.clicked.connect(self.dropBookButtonClicked)
- 点击淘汰书籍按钮,调用淘汰书籍模块
def dropBookButtonClicked(self):
dropDialog = dropBookDialog()
dropDialog.show()
dropDialog.exec_()
3、信号三
- self.userManageButton.clicked.connect(self.usermangeClicked)
- 点击用户管理按钮,调用用户管理模块
def usermangeClicked(self):
usermange = UserManage()
usermange.show()
usermange.exec_()
(四)程序入口
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
app.setWindowIcon(QIcon('./iron-man.png'))
mianMindow = AdminHome()
mianMindow.show()
sys.exit(app.exec_())
三、管理员界面展示
- 管理员主界面
- 点击添加书籍按钮
- 即可进入添加书籍界面,可在此界面进行相应操作
- 点击用户管理
- 可删除选中的用户
- 点击淘汰书籍
- 通过书号查询,来返回对应书籍信息,进行删除操作。
待后续更新....
标签:--,self,书籍,pyqt5,查询,queryModel,currentPage,Hlayout,页面 From: https://www.cnblogs.com/LoLong/p/16993410.html