更新配置文件以支持相机功能,删除旧的YAML配置,修改主窗口UI以适应新功能,添加相机显示和设置的条件逻辑。
This commit is contained in:
parent
6f41403925
commit
5977b29a9c
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,5 +0,0 @@
|
|||||||
app:
|
|
||||||
debug: true
|
|
||||||
name: jt-mes-system
|
|
||||||
version: 1.0.0
|
|
||||||
description: 佳腾管理系统
|
|
||||||
Binary file not shown.
@ -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)
|
||||||
|
|||||||
Binary file not shown.
@ -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()
|
||||||
Loading…
Reference in New Issue
Block a user