这是一个约 500 行的 Python 项目,展示了如何使用 PyQt 构建一个功能完善的人员信息管理系统。对于初学者来说,这是练手提升能力的优秀案例。
系统主界面预览:

核心界面搭建逻辑
在 init_ui 方法中,我们主要完成了三个部分的工作:基础控件布局、数据表格初始化以及交互事件绑定。代码结构清晰,便于后续扩展。
首先设置窗口标题和固定尺寸,确保界面在不同分辨率下保持整洁。字体统一使用黑体 12 号,保证可读性。
接下来是输入区域的布局。我们使用了 QLabel 配合 QLineEdit 或 QComboBox 来收集用户信息。注意字段的排列顺序,将姓名、性别、身份证等关键信息放在第一行,电话、部门、专业等次要信息紧随其后。对于日期字段,直接使用 QDateTimeEdit 并开启日历弹窗,这样用户选择生日时体验更友好。
def init_ui(self):
"""设置 UI 界面"""
self.setWindowTitle("人员管理系统")
self.setFixedSize(1220, 771)
# 创建字体对象,用来对要显示的文字进行设定
font = QtGui.QFont()
font.setFamily("黑体")
font.setPointSize(12)
# 姓名
label_name = QLabel(self)
label_name.setGeometry(40, 30, 54, 16)
label_name.setText("姓名:")
label_name.setFont(font)
self.line_edit_name = QLineEdit(self)
self.line_edit_name.setGeometry(90, 30, 141, 20)
# 性别
label_gender = QLabel(self)
label_gender.setGeometry(270, 30, , )
label_gender.setFont(font)
label_gender.setText()
.line_edit_gender = QComboBox()
.line_edit_gender.setGeometry(, , , )
.line_edit_gender.addItems([, ])
label_id = QLabel()
label_id.setGeometry(, , , )
label_id.setFont(font)
label_id.setText()
.line_edit_id = QLineEdit()
.line_edit_id.setGeometry(, , , )
label_addr = QLabel()
label_addr.setGeometry(, , , )
label_addr.setFont(font)
label_addr.setText()
.line_edit_addr = QLineEdit()
.line_edit_addr.setGeometry(, , , )
label_phone = QLabel()
label_phone.setGeometry(, , , )
label_phone.setFont(font)
label_phone.setText()
.line_edit_phone = QLineEdit()
.line_edit_phone.setGeometry(, , , )
label_department = QLabel()
label_department.setGeometry(, , , )
label_department.setFont(font)
label_department.setText()
.line_edit_department = QLineEdit()
.line_edit_department.setGeometry(, , , )
label_birthdate = QLabel()
label_birthdate.setGeometry(, , , )
label_birthdate.setFont(font)
label_birthdate.setText()
.line_edit_birthday = QDateTimeEdit()
.line_edit_birthday.setGeometry(, , , )
.line_edit_birthday.setCalendarPopup()
.line_edit_birthday.setDisplayFormat()
label_skill = QLabel()
label_skill.setGeometry(, , , )
label_skill.setFont(font)
label_skill.setText()
.line_edit_skill = QLineEdit()
.line_edit_skill.setGeometry(, , , )
label_post = QLabel()
label_post.setGeometry(, , , )
label_post.setFont(font)
label_post.setText()
.line_edit_post = QLineEdit()
.line_edit_post.setGeometry(, , , )
label_note = QLabel()
label_note.setGeometry(, , , )
label_note.setFont(font)
label_note.setText()
.text_edit_note = QTextEdit()
.text_edit_note.setGeometry(, , , )
btn_add_info = QPushButton()
btn_add_info.setGeometry(, , , )
btn_add_info.setText()
btn_add_info.clicked.connect(.add_new_student_info)
.btn_change = QPushButton(, )
.btn_change.setGeometry(, , , )
.btn_change.setVisible()
.btn_change.clicked.connect(.save_change_info)
.table_infos = QTableWidget()
.table_infos.setGeometry(, , , )
.table_infos.setColumnCount()
.table_infos.setHorizontalHeaderLabels([
, , , , , , , , , ,
])
.table_infos.setEditTriggers(QAbstractItemView.NoEditTriggers)
.table_infos.setSelectionBehavior(QAbstractItemView.SelectRows)
.table_infos.setContextMenuPolicy(Qt.CustomContextMenu)
.table_infos.customContextMenuRequested.connect(.generate_menu)
.person_no = QLineEdit()
.person_no.setGeometry(, , , )
.person_no.setVisible()
.btn_find_all = QPushButton()
.btn_find_all.setGeometry(, , , )
.btn_find_all.setText()
.btn_find_all.clicked.connect(.get_all_infos)
.label_find_type = QLabel()
.label_find_type.setGeometry(, , , )
.label_find_type.setFont(font)
.label_find_type.setText()
.select_btn = QComboBox()
.select_btn.setGeometry(, , , )
find_type = [, , , , , , ]
i, type_temp (find_type):
.select_btn.addItem()
.select_btn.setItemText(i, type_temp)
.select_btn.currentIndexChanged.connect(.change_search_type)
.line_edit_find = QLineEdit()
.line_edit_find.setGeometry(, , , )
.line_edit_star_time = QDateTimeEdit()
.line_edit_star_time.setGeometry(, , , )
.line_edit_star_time.setCalendarPopup()
.line_edit_star_time.setDisplayFormat()
.line_edit_star_time.setVisible()
.line_edit_end_time = QDateTimeEdit()
.line_edit_end_time.setGeometry(, , , )
.line_edit_end_time.setCalendarPopup()
.line_edit_end_time.setDisplayFormat()
.line_edit_end_time.setVisible()
.btn_find = QPushButton()
.btn_find.setGeometry(, , , )
.btn_find.setText()
.btn_find.clicked.connect(.search_info_from_files)

