2026-01-21 13:26:53 +08:00
|
|
|
|
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()
|
2026-01-26 09:34:42 +08:00
|
|
|
|
# 默认光标定位到工程号
|
|
|
|
|
|
if "batch_no" in self.inputs:
|
|
|
|
|
|
self.inputs["batch_no"].setFocus()
|
2026-01-21 13:26:53 +08:00
|
|
|
|
|
|
|
|
|
|
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()
|
2026-01-26 09:34:42 +08:00
|
|
|
|
# 清空后光标重新定位到工程号
|
|
|
|
|
|
if "batch_no" in self.inputs:
|
|
|
|
|
|
self.inputs["batch_no"].setFocus()
|
2026-01-21 13:26:53 +08:00
|
|
|
|
|
|
|
|
|
|
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))
|