求问如何用pyqt设计一个学生信息登记与查询系统,系统有两个页面,一个是信息登记页面,一个是信息查询页面,两个页面用选项卡QTabWidget形式切换。在登记页面录入学生的姓名、学号,在信息查询页面中,通过学生姓名来检索学生的学号,比如输入“张”,可以看到姓“张”的所有学生学号信息,若输入“张朝阳”,则只看到他的学号信息,信息查询页面中,若鼠标右键单击某一学生信息时,会出现快捷菜单,菜单上有删除命令按钮,点击按钮,该学生的信息被删除

求问如何用pyqt设计一个学生信息登记与查询系统,系统有两个页面,一个是信息登记页面,一个是信息查询页面,两个页面用选项卡QTabWidget形式切换。在登记页面录入学生的姓名、学号,在信息查询页面中,通过学生姓名来检索学生的学号,比如输入“张”,可以看到姓“张”的所有学生学号信息,若输入“张朝阳”,则只看到他的学号信息,信息查询页面中,若鼠标右键单击某一学生信息时,会出现快捷菜单,菜单上有删除命令按钮,点击按钮,该学生的信息被删除

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QTabWidget, QLabel, QLineEdit, QListWidget, QListWidgetItem, \
QHBoxLayout, QVBoxLayout, QAction, QMenu
class Student:
def __init__(self, name, id):
self.name = name
self.id = id
class RegisterWidget(QWidget):
def __init__(self):
super().__init__()
nameLabel = QLabel("姓名:")
self.nameEdit = QLineEdit()
idLabel = QLabel("学号:")
self.idEdit = QLineEdit()
hbox1 = QHBoxLayout()
hbox1.addWidget(nameLabel)
hbox1.addWidget(self.nameEdit)
hbox2 = QHBoxLayout()
hbox2.addWidget(idLabel)
hbox2.addWidget(self.idEdit)
vbox = QVBoxLayout()
vbox.addLayout(hbox1)
vbox.addLayout(hbox2)
self.setLayout(vbox)
def clear(self):
self.nameEdit.clear()
self.idEdit.clear()
class SearchWidget(QWidget):
def __init__(self, students):
super().__init__()
self.students = students
self.resultList = QListWidget()
nameLabel = QLabel("姓名:")
self.nameEdit = QLineEdit()
self.nameEdit.textChanged.connect(self.search)
hbox = QHBoxLayout()
hbox.addWidget(nameLabel)
hbox.addWidget(self.nameEdit)
vbox = QVBoxLayout()
vbox.addLayout(hbox)
vbox.addWidget(self.resultList)
self.setLayout(vbox)
def search(self):
self.resultList.clear()
name = self.nameEdit.text()
for student in self.students:
if name in student.name:
item = QListWidgetItem(student.id)
item.setData(1, student)
self.resultList.addItem(item)
def contextMenuEvent(self, event):
item = self.resultList.itemAt(event.pos())
if not item:
return
menu = QMenu(self)
deleteAction = QAction("删除", self)
deleteAction.triggered.connect(lambda: self.deleteStudent(item))
menu.addAction(deleteAction)
menu.exec(event.globalPos())
def deleteStudent(self, item):
student = item.data(1)
self.students.remove(student)
self.resultList.takeItem(self.resultList.row(item))
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.students = []
self.tabWidget = QTabWidget()
self.registerWidget = RegisterWidget()
self.tabWidget.addTab(self.registerWidget, "信息登记")
self.tabWidget.currentChanged.connect(self.clearRegister)
self.searchWidget = SearchWidget(self.students)
self.tabWidget.addTab(self.searchWidget, "信息查询")
vbox = QVBoxLayout()
vbox.addWidget(self.tabWidget)
self.setLayout(vbox)
def clearRegister(self):
if self.tabWidget.currentIndex() == 0:
self.registerWidget.clear()
def addStudent(self):
name = self.registerWidget.nameEdit.text()
id = self.registerWidget.idEdit.text()
student = Student(name, id)
self.students.append(student)
self.searchWidget.search()
self.clearRegister()
app = QApplication(sys.argv)
window = MainWindow()
window.setGeometry(300, 300, 400, 300)
window.show()
sys.exit(app.exec_())
定义了一个Student类,用来存储每个学生的信息。
RegisterWidget和SearchWidget类分别对应信息登记页面和信息查询页面,它们都继承自QWidget类。RegisterWidget中包含两个QLineEdit控件,用来录入学生的姓名和学号。SearchWidget中包含一个QLineEdit控件和一个QListWidget控件,用来输入姓名和显示查询结果。SearchWidget还重写了contextMenuEvent函数,用于处理右键单击事件,弹出快捷菜单。注意,我们在QListWidgetItem上设置了自定义数据,用于存储对应的Student对象,这样在删除学生的时候就可以直接从students列表中删除了。