readFileSystem/ui/manual_inspection_page.py
2026-01-26 09:34:42 +08:00

191 lines
6.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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