更新配置文件以支持相机功能,删除旧的YAML配置,修改主窗口UI以适应新功能,添加相机显示和设置的条件逻辑。

This commit is contained in:
zhu-mengmeng 2025-06-07 14:10:32 +08:00
parent 6f41403925
commit 5977b29a9c
6 changed files with 98 additions and 50 deletions

View File

@ -4,7 +4,8 @@
"version": "1.0.0", "version": "1.0.0",
"features": { "features": {
"enable_serial_ports": false, "enable_serial_ports": false,
"enable_keyboard_listener": false "enable_keyboard_listener": false,
"enable_camera": false
} }
}, },
"database": { "database": {
@ -15,5 +16,11 @@
"user": "", "user": "",
"password": "", "password": "",
"name": "" "name": ""
},
"camera": {
"enabled": false,
"default_exposure": 20000,
"default_gain": 10,
"default_framerate": 30
} }
} }

View File

@ -1,5 +0,0 @@
app:
debug: true
name: jt-mes-system
version: 1.0.0
description: 佳腾管理系统

View File

@ -1,7 +1,7 @@
from PySide6.QtWidgets import ( from PySide6.QtWidgets import (
QMainWindow, QWidget, QLabel, QGridLayout, QVBoxLayout, QHBoxLayout, QMainWindow, QWidget, QLabel, QGridLayout, QVBoxLayout, QHBoxLayout,
QTableWidget, QTableWidgetItem, QHeaderView, QFrame, QSplitter, QTableWidget, QTableWidgetItem, QHeaderView, QFrame, QSplitter,
QPushButton, QLineEdit, QAbstractItemView QPushButton, QLineEdit, QAbstractItemView, QComboBox
) )
from PySide6.QtGui import QFont, QAction, QBrush, QColor from PySide6.QtGui import QFont, QAction, QBrush, QColor
from PySide6.QtCore import Qt from PySide6.QtCore import Qt
@ -81,8 +81,8 @@ class MainWindowUI(QMainWindow):
self.project_layout.setContentsMargins(5, 5, 5, 5) self.project_layout.setContentsMargins(5, 5, 5, 5)
# 项目表格 # 项目表格
self.project_table = QTableWidget(4, 5) self.project_table = QTableWidget(4, 4)
self.project_table.setHorizontalHeaderLabels(["项目", "用电", "数量", "产量", "开机率"]) self.project_table.setHorizontalHeaderLabels(["用电", "数量", "产量", "开机率"])
self.project_table.setVerticalHeaderLabels(["当日", "当月", "当年", "累计"]) self.project_table.setVerticalHeaderLabels(["当日", "当月", "当年", "累计"])
self.project_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) self.project_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.project_table.verticalHeader().setSectionResizeMode(QHeaderView.Stretch) self.project_table.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)
@ -164,11 +164,12 @@ class MainWindowUI(QMainWindow):
self.order_layout = QHBoxLayout() self.order_layout = QHBoxLayout()
self.order_label = QLabel("订单") self.order_label = QLabel("订单")
self.order_label.setFont(QFont("微软雅黑", 12, QFont.Bold)) self.order_label.setFont(QFont("微软雅黑", 12, QFont.Bold))
self.order_label.setFixedHeight(30) self.order_label.setFixedHeight(35)
self.order_label.setStyleSheet("padding: 0 5px; color: #333333;") self.order_label.setStyleSheet("padding: 0 5px; color: #333333;")
self.order_edit = QLineEdit() self.order_edit = QLineEdit()
self.order_edit.setReadOnly(True) self.order_edit.setFixedHeight(35)
self.order_edit.setReadOnly(False)
self.order_edit.setFont(QFont("微软雅黑", 12)) self.order_edit.setFont(QFont("微软雅黑", 12))
self.order_edit.setText("ORD-2025-001") # 设置默认订单号 self.order_edit.setText("ORD-2025-001") # 设置默认订单号
self.order_edit.setStyleSheet("background-color: #f9f9f9; border: 1px solid #cccccc; border-radius: 3px; padding: 2px 5px;") self.order_edit.setStyleSheet("background-color: #f9f9f9; border: 1px solid #cccccc; border-radius: 3px; padding: 2px 5px;")
@ -183,7 +184,7 @@ class MainWindowUI(QMainWindow):
self.material_frame = QFrame() self.material_frame = QFrame()
self.material_frame.setFrameShape(QFrame.StyledPanel) self.material_frame.setFrameShape(QFrame.StyledPanel)
self.material_frame.setLineWidth(1) self.material_frame.setLineWidth(1)
self.material_frame.setFixedHeight(300) # 增加高度以匹配图片 self.material_frame.setFixedHeight(380) # 增加高度以匹配图片
self.material_frame.setStyleSheet("QFrame { background-color: #f8f8f8; }") self.material_frame.setStyleSheet("QFrame { background-color: #f8f8f8; }")
self.material_layout = QHBoxLayout(self.material_frame) self.material_layout = QHBoxLayout(self.material_frame)
self.material_layout.setContentsMargins(0, 0, 0, 0) self.material_layout.setContentsMargins(0, 0, 0, 0)
@ -221,10 +222,20 @@ class MainWindowUI(QMainWindow):
self.tray_label.setStyleSheet("background-color: #e0e0e0; border-right: 1px solid #cccccc; font-weight: bold;") self.tray_label.setStyleSheet("background-color: #e0e0e0; border-right: 1px solid #cccccc; font-weight: bold;")
self.tray_layout.addWidget(self.tray_label) self.tray_layout.addWidget(self.tray_label)
self.tray_edit = QLineEdit() self.tray_edit = QComboBox()
self.tray_edit.setReadOnly(True)
self.tray_edit.setStyleSheet("border: none; padding: 5px 10px;") self.tray_edit.setStyleSheet("border: none; padding: 5px 10px;")
self.tray_edit.setFont(QFont("微软雅黑", 12)) self.tray_edit.setFont(QFont("微软雅黑", 12))
self.tray_edit.setEditable(True) # 允许手动输入
self.tray_edit.setInsertPolicy(QComboBox.NoInsert) # 不自动插入用户输入到列表中
self.tray_edit.setMaxVisibleItems(10) # 设置下拉框最多显示10个项目
self.tray_edit.completer().setCaseSensitivity(Qt.CaseInsensitive) # 设置补全不区分大小写
self.tray_edit.completer().setFilterMode(Qt.MatchContains) # 设置模糊匹配模式
self.tray_edit.addItem("托盘1")
self.tray_edit.addItem("托盘2")
self.tray_edit.addItem("托盘3")
self.tray_edit.addItem("托盘4")
self.tray_edit.addItem("托盘5")
self.tray_edit.addItem("托盘6")
self.tray_layout.addWidget(self.tray_edit) self.tray_layout.addWidget(self.tray_edit)
self.left_layout.addWidget(self.tray_frame) self.left_layout.addWidget(self.tray_frame)
@ -233,7 +244,7 @@ class MainWindowUI(QMainWindow):
self.output_frame = QFrame() self.output_frame = QFrame()
self.output_frame.setFrameShape(QFrame.StyledPanel) self.output_frame.setFrameShape(QFrame.StyledPanel)
self.output_frame.setLineWidth(1) self.output_frame.setLineWidth(1)
self.output_frame.setFixedHeight(200) # 增加高度以匹配图片 self.output_frame.setFixedHeight(150) # 增加高度以匹配图片
self.output_frame.setStyleSheet("QFrame { background-color: #f8f8f8; }") self.output_frame.setStyleSheet("QFrame { background-color: #f8f8f8; }")
self.output_layout = QHBoxLayout(self.output_frame) self.output_layout = QHBoxLayout(self.output_frame)
self.output_layout.setContentsMargins(0, 0, 0, 0) self.output_layout.setContentsMargins(0, 0, 0, 0)

View File

@ -1,6 +1,7 @@
import os import os
import sys import sys
import logging import logging
import json
from datetime import datetime from datetime import datetime
# 导入PySide6 # 导入PySide6
@ -31,10 +32,21 @@ class MainWindow(MainWindowUI):
if user_name and corp_name: if user_name and corp_name:
self.setWindowTitle(f"腾智微丝产线包装系统 - {user_name} ({corp_name})") self.setWindowTitle(f"腾智微丝产线包装系统 - {user_name} ({corp_name})")
# 加载配置文件
self.config = self.load_config()
self.camera_enabled = self.config.get('camera', {}).get('enabled', False)
# # 创建相机显示组件并添加到上料区 # 只有在相机启用时创建相机显示组件
# self.camera_display = CameraDisplayWidget() if self.camera_enabled:
# self.material_content_layout.addWidget(self.camera_display) # 创建相机显示组件并添加到上料区
self.camera_display = CameraDisplayWidget()
self.material_content_layout.addWidget(self.camera_display)
else:
# 在上料区添加占位标签
self.material_placeholder = QLabel("相机功能已禁用")
self.material_placeholder.setAlignment(Qt.AlignCenter)
self.material_placeholder.setStyleSheet("color: #888888; background-color: #f0f0f0;")
self.material_content_layout.addWidget(self.material_placeholder)
# 为下料区添加占位标签,确保它保持为空 # 为下料区添加占位标签,确保它保持为空
self.output_placeholder = QLabel("下料区 - 暂无内容") self.output_placeholder = QLabel("下料区 - 暂无内容")
@ -54,7 +66,7 @@ class MainWindow(MainWindowUI):
self.setCentralWidget(self.stacked_widget) self.setCentralWidget(self.stacked_widget)
# 连接信号和槽 # 连接信号和槽
# self.connect_signals() self.connect_signals()
# 默认显示主页面 # 默认显示主页面
self.stacked_widget.setCurrentIndex(0) self.stacked_widget.setCurrentIndex(0)
@ -67,6 +79,18 @@ class MainWindow(MainWindowUI):
logging.info(f"主窗口已创建,用户: {user_name}") logging.info(f"主窗口已创建,用户: {user_name}")
def load_config(self):
"""加载配置文件"""
config_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), "config", "app_config.json")
try:
with open(config_path, 'r', encoding='utf-8') as f:
config = json.load(f)
logging.info(f"已加载配置文件: {config_path}")
return config
except Exception as e:
logging.error(f"加载配置文件失败: {e}")
return {}
def connect_signals(self): def connect_signals(self):
# 连接菜单动作 # 连接菜单动作
self.main_action.triggered.connect(self.show_main_page) self.main_action.triggered.connect(self.show_main_page)
@ -78,14 +102,15 @@ class MainWindow(MainWindowUI):
self.start_button.clicked.connect(self.handle_start) self.start_button.clicked.connect(self.handle_start)
self.stop_button.clicked.connect(self.handle_stop) self.stop_button.clicked.connect(self.handle_stop)
# 连接相机显示组件信号 # 只有在相机启用时连接相机信号
self.camera_display.signal_camera_status.connect(self.handle_camera_status) if self.camera_enabled and hasattr(self, 'camera_display'):
self.camera_display.signal_camera_status.connect(self.handle_camera_status)
def initialize_data(self): def initialize_data(self):
"""初始化界面数据""" """初始化界面数据"""
# 设置订单和批号 # 设置订单和批号
self.order_edit.setText("ORD-2025-001") self.order_edit.setText("ORD-2025-001")
self.tray_edit.setText("BAT-2025-001") self.tray_edit.setCurrentText("托盘1")
# 初始化项目表格数据示例 # 初始化项目表格数据示例
project_data = [ project_data = [
@ -96,8 +121,8 @@ class MainWindow(MainWindowUI):
] ]
for row in range(4): for row in range(4):
for col in range(1, 5): # 从第2列开始跳过项目列 for col in range(0, 4): # 从第2列开始跳过项目列
item = QTableWidgetItem(project_data[row][col-1]) item = QTableWidgetItem(project_data[row][col])
# item.setTextAlignment(Qt.AlignCenter) # 设置文本居中对齐 # item.setTextAlignment(Qt.AlignCenter) # 设置文本居中对齐
self.project_table.setItem(row, col, item) self.project_table.setItem(row, col, item)
@ -112,36 +137,40 @@ class MainWindow(MainWindowUI):
def show_main_page(self): def show_main_page(self):
self.stacked_widget.setCurrentWidget(self.central_widget) self.stacked_widget.setCurrentWidget(self.central_widget)
# 如果相机已连接,直接开始显示相机画面 # 只有在相机启用时处理相机显示
if self.camera_display.camera_manager.isOpen: if self.camera_enabled and hasattr(self, 'camera_display'):
if not self.camera_display.camera_manager.isGrabbing: # 如果相机已连接,直接开始显示相机画面
self.camera_display.start_display() if self.camera_display.camera_manager.isOpen:
if not self.camera_display.camera_manager.isGrabbing:
self.camera_display.start_display()
logging.info("显示主页面") logging.info("显示主页面")
def show_settings_page(self): def show_settings_page(self):
# 延迟创建相机设置组件 # 只有在相机启用时才创建相机设置组件
if self.camera_settings is None: if self.camera_enabled:
self.camera_settings = CameraSettingsWidget() # 延迟创建相机设置组件
# 连接相机设置信号 if self.camera_settings is None:
self.camera_settings.signal_camera_connection.connect(self.handle_camera_connection) self.camera_settings = CameraSettingsWidget()
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.camera_settings.signal_camera_connection.connect(self.handle_camera_connection)
# 添加到堆叠部件 self.camera_settings.signal_camera_params_changed.connect(self.handle_camera_params_changed)
self.stacked_widget.addWidget(self.camera_settings) 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)
else:
# 如果相机未启用,显示提示信息
QMessageBox.information(self, "设置", "相机功能已在配置文件中禁用,无法打开相机设置页面。")
# 切换到设置页面
self.stacked_widget.setCurrentWidget(self.camera_settings)
logging.info("显示设置页面") logging.info("显示设置页面")
def handle_input(self): def handle_input(self):
"""处理上料按钮点击事件""" """处理上料按钮点击事件"""
logging.info("上料按钮被点击") 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, "操作提示", "开始上料操作") QMessageBox.information(self, "操作提示", "开始上料操作")
# 这里添加上料相关的业务逻辑 # 这里添加上料相关的业务逻辑
@ -155,9 +184,11 @@ class MainWindow(MainWindowUI):
"""处理开始按钮点击事件""" """处理开始按钮点击事件"""
logging.info("开始按钮被点击") logging.info("开始按钮被点击")
# 开始显示相机画面 # 只有在相机启用时处理相机显示
if self.camera_display.camera_manager.isOpen: if self.camera_enabled and hasattr(self, 'camera_display'):
self.camera_display.start_display() # 开始显示相机画面
if self.camera_display.camera_manager.isOpen:
self.camera_display.start_display()
QMessageBox.information(self, "操作提示", "生产线已启动") QMessageBox.information(self, "操作提示", "生产线已启动")
# 这里添加启动生产线的业务逻辑 # 这里添加启动生产线的业务逻辑
@ -166,8 +197,10 @@ class MainWindow(MainWindowUI):
"""处理暂停按钮点击事件""" """处理暂停按钮点击事件"""
logging.info("暂停按钮被点击") logging.info("暂停按钮被点击")
# 停止显示相机画面 # 只有在相机启用时处理相机显示
self.camera_display.stop_display() if self.camera_enabled and hasattr(self, 'camera_display'):
# 停止显示相机画面
self.camera_display.stop_display()
QMessageBox.information(self, "操作提示", "生产线已暂停") QMessageBox.information(self, "操作提示", "生产线已暂停")
# 这里添加暂停生产线的业务逻辑 # 这里添加暂停生产线的业务逻辑
@ -206,8 +239,10 @@ class MainWindow(MainWindowUI):
def closeEvent(self, event): def closeEvent(self, event):
"""窗口关闭事件""" """窗口关闭事件"""
# 停止相机显示 # 只有在相机启用时处理相机关闭
self.camera_display.stop_display() if self.camera_enabled and hasattr(self, 'camera_display'):
# 停止相机显示
self.camera_display.stop_display()
# 接受关闭事件 # 接受关闭事件
event.accept() event.accept()