pyqt5设计学生信息表

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

img

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列表中删除了。

该回答引用ChatGPT
这个问题需要用到PyQt5的一些基本组件,包括QTabWidget、QLineEdit、QTableWidget、QMenu等。下面是一个简单的实现过程:
1. 导入必要的模块
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

2. 创建主窗口和选项卡
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)

3. 创建信息登记页面
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()

4. 创建信息查询页面
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)

完整代码如下:您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632