first commit

This commit is contained in:
2025-09-06 16:06:30 +08:00
commit 401ef07f5f
49 changed files with 18045 additions and 0 deletions
View File
+67
View File
@@ -0,0 +1,67 @@
from qfluentwidgets import MessageBoxBase, LineEdit, ComboBox, SubtitleLabel
from PySide6.QtWidgets import QGridLayout, QLabel
from PySide6.QtCore import Qt
from PySide6.QtGui import QFont
class BaseStudentDilalog(MessageBoxBase):
def __init__(self, title, parent=None):
super().__init__(parent)
self.title = title
self.setup_ui()
def setup_ui(self):
self.titleLabel = SubtitleLabel(self.title, self)
self.viewLayout.addWidget(self.titleLabel)
self.viewLayout.setAlignment(self.titleLabel, Qt.AlignmentFlag.AlignCenter)
grid_layout = QGridLayout()
self.viewLayout.addLayout(grid_layout)
self.nameInput = LineEdit(self)
self.numberInput = LineEdit(self)
self.genderCombo = ComboBox(self)
self.genderCombo.addItems(["男", "女"])
self.classCombo = ComboBox(self)
self.chineseInput = LineEdit(self)
self.mathInput = LineEdit(self)
self.englishInput = LineEdit(self)
fields = [
("姓名: ", self.nameInput),
("学号: ", self.numberInput),
("性别: ", self.genderCombo),
("班级: ", self.classCombo),
("语文: ", self.chineseInput),
("数学: ", self.mathInput),
("英语: ", self.englishInput),
]
for row, (label_text, widget) in enumerate(fields):
label_widget = QLabel(label_text)
font = QFont("微软雅黑")
font.setBold(True)
label_widget.setFont(font)
grid_layout.addWidget(label_widget, row, 0)
grid_layout.addWidget(widget, row, 1)
grid_layout.setColumnStretch(1, 1)
grid_layout.setAlignment(Qt.AlignmentFlag.AlignLeft)
self.yesButton.setText('确定')
self.cancelButton.setText('取消')
for widget in [field[1] for field in fields]:
widget.setMinimumWidth(200)
self.nameInput.setFocus()
self.yesButton.setDefault(False)
self.yesButton.setAutoDefault(False)
class AddStudentDilalog(BaseStudentDilalog):
def __init__(self, parent=None):
super().__init__("添加学生", parent)
self.student_id = None
self.yesButton.setText('添加')
+116
View File
@@ -0,0 +1,116 @@
import json
from PySide6.QtGui import QIcon
from PySide6.QtCore import Slot
from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QHeaderView, QCheckBox, QTableWidgetItem
from queue_sqlite.model import MessageItem
from qfluentwidgets import CardWidget, PushButton, SearchLineEdit, TableWidget, setCustomStyleSheet
from .student_dilalog import AddStudentDilalog
from ...style.button_style import ADD_BUTTON_STYLE, BATCH_DELETE_BUTTON_STYLE
from ...signal import global_signals
from ...signal import listen_signals
from ...scheduler_manager import scheduler
class StudentInterface(QWidget):
def __init__(self):
super().__init__()
self.setObjectName("student_interface")
self.students = []
self.setup_ui()
self.create_signal_slot()
self.load_data()
self.populate_table(self.students)
def create_signal_slot(self):
global_signals.show_add_dialog_signal.connect(self.show_add_student_dialog)
listen_signals.listening_students_signal.connect(self.populate_table)
def setup_ui(self):
# 设置 title
self.setWindowTitle("学生管理")
layout = QVBoxLayout(self)
layout.setContentsMargins(20, 50, 20, 20) # (左, 上, 右, 下)
card_widget = CardWidget(self)
buttons_layout = QHBoxLayout(card_widget)
self.addButton = PushButton("新增", self)
setCustomStyleSheet(self.addButton, ADD_BUTTON_STYLE, ADD_BUTTON_STYLE)
self.addButton.clicked.connect(self.add_student)
self.searchInput = SearchLineEdit(self)
self.searchInput.setPlaceholderText("搜索学生姓名或学号...")
self.searchInput.setFixedWidth(500)
self.batchDeleteButton = PushButton("批量删除", self)
setCustomStyleSheet(self.batchDeleteButton, BATCH_DELETE_BUTTON_STYLE, BATCH_DELETE_BUTTON_STYLE)
buttons_layout.addWidget(self.addButton)
buttons_layout.addWidget(self.searchInput)
buttons_layout.addStretch(2)
buttons_layout.addWidget(self.batchDeleteButton)
layout.addWidget(card_widget)
self.table_widget = TableWidget(self)
self.table_widget.setBorderRadius(8) # 设置边框圆角
self.table_widget.setBorderVisible(True) # 设置表格边框可见
table_labels = ["", "学生ID", "姓名", "学号", "性别", "班级", "语文", "数学", "英语", "总分", "操作"]
self.table_widget.setColumnCount(len(table_labels))
self.table_widget.setHorizontalHeaderLabels(table_labels)
self.table_widget.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch)
layout.addWidget(self.table_widget)
self.setStyleSheet("StudentInterface {background: white}")
self.setWindowIcon(QIcon('./resources/images/logo.png'))
def load_data(self):
self.students = [
{"student_id": 1, "student_name": "张三", "student_number": "2024010101", "gender": 1, "class_name": "1班", "chinese_score": 80, "math_score": 85, "english_score": 90, "total_score": 265},
{"student_id": 1, "student_name": "张三", "student_number": "2024010101", "gender": 1, "class_name": "1班", "chinese_score": 80, "math_score": 85, "english_score": 90, "total_score": 265},
{"student_id": 1, "student_name": "张三", "student_number": "2024010101", "gender": 1, "class_name": "1班", "chinese_score": 80, "math_score": 85, "english_score": 90, "total_score": 265},
{"student_id": 1, "student_name": "张三", "student_number": "2024010101", "gender": 1, "class_name": "1班", "chinese_score": 80, "math_score": 85, "english_score": 90, "total_score": 265},
{"student_id": 1, "student_name": "张三", "student_number": "2024010101", "gender": 1, "class_name": "1班", "chinese_score": 80, "math_score": 85, "english_score": 90, "total_score": 265},
]
scheduler.update_listen_data("students", json.dumps(self.students))
@Slot(list)
def populate_table(self, students: list):
print(f"Received students: {students}")
self.table_widget.setRowCount(len(students))
for row, student_info in enumerate(students):
self.setup_table_row(row, student_info)
def setup_table_row(self, row, student_info):
checkbox = QCheckBox()
checkbox.setStyleSheet("margin: 10px")
self.table_widget.setCellWidget(row, 0, checkbox)
for col, key in enumerate(self.students[0].keys()):
value = student_info.get(key, "")
if key == "gender":
value = "男" if value == 1 else "女" if value == 2 else "未知"
item = QTableWidgetItem(str(value))
self.table_widget.setItem(row, col+1, item)
@Slot(dict)
def show_add_student_dialog(self, message_dict: dict):
message = MessageItem.from_dict(message_dict)
print(f"Received message: {message}")
print("Creating and showing AddStudentDialog")
self.addButton.setEnabled(True)
add_student_dialog = AddStudentDilalog(self)
if add_student_dialog.exec():
print("用户点击了添加按钮")
else:
print("用户点击了取消按钮")
def add_student_callback(self, message: MessageItem):
global_signals.show_add_dialog_signal.emit(message.to_dict())
def add_student(self):
self.addButton.setEnabled(False)
scheduler.send_message(MessageItem(content={}, destination="add_student"), self.add_student_callback)