jiateng_ws/widgets/main_window.py
2025-06-07 10:45:09 +08:00

213 lines
8.4 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.

import os
import sys
import logging
from datetime import datetime
# 导入PySide6
from PySide6.QtWidgets import QWidget, QMessageBox, QTableWidgetItem, QStackedWidget, QLabel
from PySide6.QtCore import Qt, QTimer
from PySide6.QtGui import QBrush, QColor
# 导入UI
from ui.main_window_ui import MainWindowUI
# 导入相机显示组件和设置组件
from widgets.camera_display_widget import CameraDisplayWidget
from widgets.camera_settings_widget import CameraSettingsWidget
class MainWindow(MainWindowUI):
"""主窗口"""
def __init__(self, user_id=None, user_name=None, corp_name=None, corp_id=None, position_id=None):
super().__init__()
self.user_id = user_id
self.user_name = user_name
self.corp_name = corp_name
self.corp_id = corp_id
self.position_id = position_id
# 设置窗口标题
if user_name and corp_name:
self.setWindowTitle(f"腾智微丝产线包装系统 - {user_name} ({corp_name})")
# # 创建相机显示组件并添加到上料区
# self.camera_display = CameraDisplayWidget()
# self.material_content_layout.addWidget(self.camera_display)
# 为下料区添加占位标签,确保它保持为空
self.output_placeholder = QLabel("下料区 - 暂无内容")
self.output_placeholder.setAlignment(Qt.AlignCenter)
self.output_placeholder.setStyleSheet("color: #888888; background-color: #f0f0f0;")
self.output_content_layout.addWidget(self.output_placeholder)
# 创建堆叠部件
self.stacked_widget = QStackedWidget()
self.stacked_widget.addWidget(self.central_widget) # 主页面
# 不在这里直接初始化相机设置组件
# 延迟创建保证创建的时候SettingsUI的所有控件都已经准备好
self.camera_settings = None
# 设置中央部件为堆叠部件
self.setCentralWidget(self.stacked_widget)
# 连接信号和槽
# self.connect_signals()
# 默认显示主页面
self.stacked_widget.setCurrentIndex(0)
# 初始化数据
self.initialize_data()
# 配置检验列为5列
self.set_inspection_columns(5)
logging.info(f"主窗口已创建,用户: {user_name}")
def connect_signals(self):
# 连接菜单动作
self.main_action.triggered.connect(self.show_main_page)
self.settings_action.triggered.connect(self.show_settings_page)
# 连接按钮事件
self.input_button.clicked.connect(self.handle_input)
self.output_button.clicked.connect(self.handle_output)
self.start_button.clicked.connect(self.handle_start)
self.stop_button.clicked.connect(self.handle_stop)
# 连接相机显示组件信号
self.camera_display.signal_camera_status.connect(self.handle_camera_status)
def initialize_data(self):
"""初始化界面数据"""
# 设置订单和批号
self.order_edit.setText("ORD-2025-001")
self.tray_edit.setText("BAT-2025-001")
# 初始化项目表格数据示例
project_data = [
["100", "50", "200", "95%"],
["3000", "1500", "6000", "92%"],
["36000", "18000", "72000", "90%"],
["120000", "60000", "240000", "91%"]
]
for row in range(4):
for col in range(1, 5): # 从第2列开始跳过项目列
item = QTableWidgetItem(project_data[row][col-1])
# item.setTextAlignment(Qt.AlignCenter) # 设置文本居中对齐
self.project_table.setItem(row, col, item)
# 初始化任务表格数据示例 - 注意现在表格有3行第0行是一级标题第1行是二级标题第2行是数据行
# 数据应该填充在第2行索引为2
data = ["200", "95", "0", "0"] # 分别对应:总生产数量、总生产公斤、已完成数量、已完成公斤
for col, value in enumerate(data):
item = QTableWidgetItem(value)
item.setTextAlignment(Qt.AlignCenter) # 设置文本居中对齐
self.task_table.setItem(2, col, item)
def show_main_page(self):
self.stacked_widget.setCurrentWidget(self.central_widget)
# 如果相机已连接,直接开始显示相机画面
if self.camera_display.camera_manager.isOpen:
if not self.camera_display.camera_manager.isGrabbing:
self.camera_display.start_display()
logging.info("显示主页面")
def show_settings_page(self):
# 延迟创建相机设置组件
if self.camera_settings is None:
self.camera_settings = CameraSettingsWidget()
# 连接相机设置信号
self.camera_settings.signal_camera_connection.connect(self.handle_camera_connection)
self.camera_settings.signal_camera_params_changed.connect(self.handle_camera_params_changed)
self.camera_settings.signal_camera_error.connect(self.handle_camera_error)
# 添加到堆叠部件
self.stacked_widget.addWidget(self.camera_settings)
# 切换到设置页面
self.stacked_widget.setCurrentWidget(self.camera_settings)
logging.info("显示设置页面")
def handle_input(self):
"""处理上料按钮点击事件"""
logging.info("上料按钮被点击")
# 如果相机已经配置,则开始显示
if self.camera_display.camera_manager.isOpen and not self.camera_display.camera_manager.isGrabbing:
self.camera_display.start_display()
QMessageBox.information(self, "操作提示", "开始上料操作")
# 这里添加上料相关的业务逻辑
def handle_output(self):
"""处理下料按钮点击事件"""
logging.info("下料按钮被点击")
QMessageBox.information(self, "操作提示", "开始下料操作")
# 这里添加下料相关的业务逻辑
def handle_start(self):
"""处理开始按钮点击事件"""
logging.info("开始按钮被点击")
# 开始显示相机画面
if self.camera_display.camera_manager.isOpen:
self.camera_display.start_display()
QMessageBox.information(self, "操作提示", "生产线已启动")
# 这里添加启动生产线的业务逻辑
def handle_stop(self):
"""处理暂停按钮点击事件"""
logging.info("暂停按钮被点击")
# 停止显示相机画面
self.camera_display.stop_display()
QMessageBox.information(self, "操作提示", "生产线已暂停")
# 这里添加暂停生产线的业务逻辑
def handle_camera_status(self, is_connected, message):
"""处理相机状态变化"""
if is_connected:
logging.info("相机已连接并显示")
else:
logging.warning(f"相机显示问题: {message}")
def handle_camera_connection(self, is_connected, message):
"""处理相机连接状态变化"""
if is_connected:
logging.info("相机已连接")
# 如果当前在主页面,直接开始显示相机画面
if self.stacked_widget.currentWidget() == self.central_widget:
self.camera_display.start_display()
else:
if message:
logging.warning(f"相机连接失败: {message}")
else:
logging.info("相机已断开")
# 如果相机断开,确保停止显示
self.camera_display.stop_display()
def handle_camera_params_changed(self, exposure_time, gain, frame_rate):
"""处理相机参数变化"""
logging.info(f"相机参数已更新: 曝光={exposure_time:.1f}μs, 增益={gain:.1f}dB, 帧率={frame_rate:.1f}fps")
# 这里可以添加对相机参数变化的处理逻辑
def handle_camera_error(self, error_msg):
"""处理相机错误"""
logging.error(f"相机错误: {error_msg}")
QMessageBox.warning(self, "相机错误", error_msg)
def closeEvent(self, event):
"""窗口关闭事件"""
# 停止相机显示
self.camera_display.stop_display()
# 接受关闭事件
event.accept()