readFileSystem/ui/manual_inspection_page.py

191 lines
6.8 KiB
Python
Raw Normal View History

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()
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()
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))