from PySide6.QtWidgets import ( QWidget, QTableWidget, QTableWidgetItem, QHeaderView, QLineEdit, QAbstractItemView ) from PySide6.QtCore import Qt from PySide6.QtGui import QColor, QBrush from ui.base_page import BaseInspectionPage class ManualInspectionPage(BaseInspectionPage): def __init__(self, parent=None): super().__init__("手检", parent) self.inputs = {} self.init_ui() def init_ui(self): self.content_layout.setContentsMargins(5, 5, 5, 5) # Initialize Table self.table = QTableWidget() self.table.setColumnCount(4) self.table.verticalHeader().setVisible(False) self.table.horizontalHeader().setVisible(False) # Style self.table.setStyleSheet(""" QTableWidget { border: 1px solid #999; gridline-color: #999; background-color: white; font-family: 'Microsoft YaHei'; font-size: 18px; } QTableWidget::item { padding: 0px; } QLineEdit { border: none; background-color: transparent; font-family: 'Microsoft YaHei'; font-size: 18px; padding-left: 8px; qproperty-alignment: 'AlignLeft | AlignVCenter'; } """) header = self.table.horizontalHeader() header.setSectionResizeMode(QHeaderView.Stretch) self.table.setSelectionMode(QAbstractItemView.NoSelection) self.table.setFocusPolicy(Qt.NoFocus) self.content_layout.addWidget(self.table) self.render_form() # 默认光标定位到工程号 if "batch_no" in self.inputs: self.inputs["batch_no"].setFocus() def render_form(self): # 1. 第一行 - 工程号 self.add_row_label_input("工程号", "batch_no", span_input=3) # 2. 第二行 - 产地和规格 row = self.table.rowCount() self.table.insertRow(row) self.table.setRowHeight(row, 50) self.set_label_cell(row, 0, "产地") self.table.setCellWidget(row, 1, self.create_input("material")) self.set_label_cell(row, 2, "规格") self.table.setCellWidget(row, 3, self.create_input("spec")) # 3. 分组标题 - 第一组 self.add_group_header("━ 第一组 ━") # 4. 炉号和材质(第一组) row = self.table.rowCount() self.table.insertRow(row) self.table.setRowHeight(row, 50) self.set_label_cell(row, 0, "炉号", align_left=True) self.table.setCellWidget(row, 1, self.create_input("material1")) self.set_label_cell(row, 2, "材质") self.table.setCellWidget(row, 3, self.create_input("spec1")) # 5. 检验信息(第一组) self.add_row_label_input("检验信息", "insp_info_1", span_input=3, align_left=True) # 6. 分组标题 - 第二组 self.add_group_header("━ 第二组 ━") # 7. 炉号和材质(第二组) row = self.table.rowCount() self.table.insertRow(row) self.table.setRowHeight(row, 50) self.set_label_cell(row, 0, "炉号", align_left=True) self.table.setCellWidget(row, 1, self.create_input("info1")) self.set_label_cell(row, 2, "材质") self.table.setCellWidget(row, 3, self.create_input("spec2")) # 8. 检验信息(第二组) self.add_row_label_input("检验信息", "insp_info_2", span_input=3, align_left=True) # 9. 分组标题 - 检验值 self.add_group_header("━ 检验值 ━") # 10. 元素行 - 固定顺序显示所有18个元素 element_order = ["C", "Si", "Mn", "P", "S", "Cr", "Ni", "Mo", "Cu", "Ti", "Nb", "V", "Al", "W", "Co", "N", "Fe", "Se"] for i in range(0, len(element_order), 2): name1 = element_order[i] name2 = element_order[i+1] if i + 1 < len(element_order) else None row = self.table.rowCount() self.table.insertRow(row) self.table.setRowHeight(row, 50) self.set_label_cell(row, 0, name1) self.table.setCellWidget(row, 1, self.create_input(name1)) if name2: self.set_label_cell(row, 2, name2) self.table.setCellWidget(row, 3, self.create_input(name2)) def add_row_label_input(self, label_text, key, span_input=1, align_left=False): row = self.table.rowCount() self.table.insertRow(row) self.table.setRowHeight(row, 50) self.set_label_cell(row, 0, label_text, align_left=align_left) inp = self.create_input(key) self.table.setCellWidget(row, 1, inp) if span_input > 1: self.table.setSpan(row, 1, 1, span_input) def set_label_cell(self, row, col, text, align_left=False): item = QTableWidgetItem(text) # 根据参数设置对齐方式 if align_left: item.setTextAlignment(Qt.AlignLeft | Qt.AlignVCenter) else: item.setTextAlignment(Qt.AlignCenter) item.setFlags(Qt.ItemIsEnabled) brush = QBrush(QColor("#f5f5f5")) item.setBackground(brush) self.table.setItem(row, col, item) def add_group_header(self, text): """添加分组标题行""" row = self.table.rowCount() self.table.insertRow(row) self.table.setRowHeight(row, 40) item = QTableWidgetItem(text) item.setTextAlignment(Qt.AlignCenter) item.setFlags(Qt.ItemIsEnabled) brush = QBrush(QColor("#f0f0f0")) item.setBackground(brush) from PySide6.QtGui import QFont font = QFont() font.setBold(True) font.setPointSize(14) item.setFont(font) self.table.setItem(row, 0, item) self.table.setSpan(row, 0, 1, 4) def create_input(self, key): inp = QLineEdit() inp.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.inputs[key] = inp return inp def clear_data(self): """清空所有输入框数据""" for inp in self.inputs.values(): inp.clear() # 清空后光标重新定位到工程号 if "batch_no" in self.inputs: self.inputs["batch_no"].setFocus() def update_ui_with_data(self, data): """根据数据库数据动态更新UI""" elements = data.get("elements", {}) # 固定元素顺序 element_order = ["C", "Si", "Mn", "P", "S", "Cr", "Ni", "Mo", "Cu", "Ti", "Nb", "V", "Al", "W", "Co", "N", "Fe", "Se"] # 更新所有元素值,没有的显示为0 for el in element_order: if el in self.inputs: value = elements.get(el, 0) self.inputs[el].setText(str(value))