首页 > 其他分享 >pyqt5图书管理系统--7、管理员页面设计之所有书籍

pyqt5图书管理系统--7、管理员页面设计之所有书籍

时间:2022-12-20 00:11:06浏览次数:29  
标签:-- self 书籍 pyqt5 查询 queryModel currentPage Hlayout 页面

本节分为两个部分:整合管理员界面、所有书籍查询界面设计。

主要流程: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

相关文章

  • 「一劳永逸」一张脑图带你掌握Git命令
    前言最近在网易工作之余,遇到Git上面一些问题,趁这次的机会,补一补Git基础知识。公众号前端UpUp,回复Git,即可获取脑图。联系......
  • Java Endorsed Standards Override Mechanism
    参考资料https://docs.oracle.com/javase/6/docs/technotes/guides/standards/介绍FromtimetotimeitisnecessarytoupdatetheJavaplatforminordertoinc......
  • python强大的hook函数
    什么是hook?钩子函数(hookfunction),可以理解是一个挂钩,作用是有需要的时候挂一个东西上去。具体的解释是:钩子函数是把我们自己实现的hook函数在某一时刻挂接到目标挂载点上......
  • Python 发起post/get请求(封装)
    get和post是最常用的http/htttps请求方式,一定要掌握好二者各自特点以及区别。get和post特点:#get请求请求参数在请求地址后面,提交的数据量较小,安全性较差,不建议用来提交敏......
  • weblogic上部署CXFwebservice 错误!
    转自https://www.pianshen.com/article/4737505565/发布到weblogic上,输入网址http://localhost:7002/CxfTest/ws/helloService?wsdl;能正常显示出xml1、但是在客户端调用......
  • printf你会吗?:-)
    https://cplusplus.com/reference/cstdio/printfAformatspecifierfollowsthisprototype: %[flags][width][.precision][length]specifierpPointeraddressb80000......
  • 陶瓷工厂的进销存管理系统的设计与实现
    毕业设计(论文)论文题目XXX陶瓷工厂的进销存管理系统的设计与实现ThesisTopicTheDesignandImplementationoftheXXXCeramicFactoryInventoryManagementSystem毕业......
  • leetcode-最长回文子串
    给你一个字符串s,找到s中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例1:输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答......
  • 油猴插件的下载、安装、使用教程及几个好用的脚本推荐
    Chrome浏览器(及基于Chromium内核的各种版本浏览器)之所以受到众多用户喜爱,除了它界面简洁、速度很快之外,另一方面就是它拥有各种各样功能丰富的扩展插件,可以实现屏蔽广告、页......
  • #yyds干货盘点#配置 dev-server
    安装依赖包yarnaddwebpack-dev-server-D常用配置devServer:{contentBase:path.join(__dirname,'static'),//告诉服务器从哪里提供内容(默认当前工作目录)ope......