求问如何用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列表中删除了。
python
from PyQt5.QtWidgets import QApplication, QWidget, QTabWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QTableWidget, QTableWidgetItem, QMenu, QAction
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt
python
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('学生信息管理系统')
self.setWindowIcon(QIcon('icon.png'))
self.resize(600, 400)
self.tab_widget = QTabWidget(self)
self.tab_widget.addTab(RegisterWidget(), '信息登记')
self.tab_widget.addTab(QueryWidget(), '信息查询')
layout = QVBoxLayout(self)
layout.addWidget(self.tab_widget)
python
class RegisterWidget(QWidget):
def __init__(self):
super().__init__()
layout = QVBoxLayout(self)
name_layout = QHBoxLayout()
name_label = QLabel('姓名:')
self.name_edit = QLineEdit()
name_layout.addWidget(name_label)
name_layout.addWidget(self.name_edit)
id_layout = QHBoxLayout()
id_label = QLabel('学号:')
self.id_edit = QLineEdit()
id_layout.addWidget(id_label)
id_layout.addWidget(self.id_edit)
button_layout = QHBoxLayout()
submit_button = QPushButton('提交')
submit_button.clicked.connect(self.submit)
clear_button = QPushButton('清空')
clear_button.clicked.connect(self.clear)
button_layout.addWidget(submit_button)
button_layout.addWidget(clear_button)
layout.addLayout(name_layout)
layout.addLayout(id_layout)
layout.addLayout(button_layout)
def submit(self):
name = self.name_edit.text()
id = self.id_edit.text()
# 将学生信息保存到数据库或文件中
# ...
def clear(self):
self.name_edit.clear()
self.id_edit.clear()
python
class QueryWidget(QWidget):
def __init__(self):
super().__init__()
layout = QVBoxLayout(self)
search_layout = QHBoxLayout()
search_label = QLabel('姓名:')
self.search_edit = QLineEdit()
self.search_edit.textChanged.connect(self.search)
search_layout.addWidget(search_label)
search_layout.addWidget(self.search_edit)
self.table_widget = QTableWidget(self)
self.table_widget.setColumnCount(2)
self.table_widget.setHorizontalHeaderLabels(['姓名', '学号'])
self.table_widget.setContextMenuPolicy(Qt.CustomContextMenu)
self.table_widget.customContextMenuRequested.connect(self.show_menu)
layout.addLayout(search_layout)
layout.addWidget(self.table_widget)
def search(self):
keyword = self.search_edit.text()
# 从数据库或文件中查询学生信息
# ...
# 将查询结果显示在表格中
self.table_widget.setRowCount(len(results))
for i, result in enumerate(results):
name_item = QTableWidgetItem(result['name'])
id_item = QTableWidgetItem(result['id'])
self.table_widget.setItem(i, 0, name_item)
self.table_widget.setItem(i, 1, id_item)
def show_menu(self, pos):
menu = QMenu(self)
delete_action = QAction('删除', self)
delete_action.triggered.connect(self.delete_student)
menu.addAction(delete_action)
menu.exec_(self.table_widget.mapToGlobal(pos))
def delete_student(self):
row = self.table_widget.currentRow()
name_item = self.table_widget.item(row, 0)
id_item = self.table_widget.item(row, 1)
name = name_item.text()
id = id_item.text()
# 从数据库或文件中删除学生信息
# ...
self.table_widget.removeRow(row)