diff --git a/config/app_config.json b/config/app_config.json index bd9d635..25b7a77 100644 --- a/config/app_config.json +++ b/config/app_config.json @@ -4,7 +4,8 @@ "version": "1.0.0", "features": { "enable_serial_ports": false, - "enable_keyboard_listener": false + "enable_keyboard_listener": false, + "enable_camera": false } }, "database": { @@ -15,5 +16,11 @@ "user": "", "password": "", "name": "" + }, + "camera": { + "enabled": false, + "default_exposure": 20000, + "default_gain": 10, + "default_framerate": 30 } } \ No newline at end of file diff --git a/config/application.yaml b/config/application.yaml deleted file mode 100644 index 37e2a29..0000000 --- a/config/application.yaml +++ /dev/null @@ -1,5 +0,0 @@ -app: - debug: true - name: jt-mes-system - version: 1.0.0 - description: 佳腾管理系统 diff --git a/ui/__pycache__/main_window_ui.cpython-310.pyc b/ui/__pycache__/main_window_ui.cpython-310.pyc index 7357503..4633566 100644 Binary files a/ui/__pycache__/main_window_ui.cpython-310.pyc and b/ui/__pycache__/main_window_ui.cpython-310.pyc differ diff --git a/ui/main_window_ui.py b/ui/main_window_ui.py index 8794fed..8060154 100644 --- a/ui/main_window_ui.py +++ b/ui/main_window_ui.py @@ -1,7 +1,7 @@ from PySide6.QtWidgets import ( QMainWindow, QWidget, QLabel, QGridLayout, QVBoxLayout, QHBoxLayout, QTableWidget, QTableWidgetItem, QHeaderView, QFrame, QSplitter, - QPushButton, QLineEdit, QAbstractItemView + QPushButton, QLineEdit, QAbstractItemView, QComboBox ) from PySide6.QtGui import QFont, QAction, QBrush, QColor from PySide6.QtCore import Qt @@ -81,8 +81,8 @@ class MainWindowUI(QMainWindow): self.project_layout.setContentsMargins(5, 5, 5, 5) # 项目表格 - self.project_table = QTableWidget(4, 5) - self.project_table.setHorizontalHeaderLabels(["项目", "用电", "数量", "产量", "开机率"]) + self.project_table = QTableWidget(4, 4) + self.project_table.setHorizontalHeaderLabels(["用电", "数量", "产量", "开机率"]) self.project_table.setVerticalHeaderLabels(["当日", "当月", "当年", "累计"]) self.project_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) self.project_table.verticalHeader().setSectionResizeMode(QHeaderView.Stretch) @@ -164,11 +164,12 @@ class MainWindowUI(QMainWindow): self.order_layout = QHBoxLayout() self.order_label = QLabel("订单") 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_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.setText("ORD-2025-001") # 设置默认订单号 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.setFrameShape(QFrame.StyledPanel) 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_layout = QHBoxLayout(self.material_frame) 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_layout.addWidget(self.tray_label) - self.tray_edit = QLineEdit() - self.tray_edit.setReadOnly(True) + self.tray_edit = QComboBox() self.tray_edit.setStyleSheet("border: none; padding: 5px 10px;") 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.left_layout.addWidget(self.tray_frame) @@ -233,7 +244,7 @@ class MainWindowUI(QMainWindow): self.output_frame = QFrame() self.output_frame.setFrameShape(QFrame.StyledPanel) 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_layout = QHBoxLayout(self.output_frame) self.output_layout.setContentsMargins(0, 0, 0, 0) diff --git a/widgets/__pycache__/main_window.cpython-310.pyc b/widgets/__pycache__/main_window.cpython-310.pyc index b404c46..15657d7 100644 Binary files a/widgets/__pycache__/main_window.cpython-310.pyc and b/widgets/__pycache__/main_window.cpython-310.pyc differ diff --git a/widgets/main_window.py b/widgets/main_window.py index bc27b86..6d341cb 100644 --- a/widgets/main_window.py +++ b/widgets/main_window.py @@ -1,6 +1,7 @@ import os import sys import logging +import json from datetime import datetime # 导入PySide6 @@ -31,10 +32,21 @@ class MainWindow(MainWindowUI): if user_name and 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() - # self.material_content_layout.addWidget(self.camera_display) + # 只有在相机启用时创建相机显示组件 + if self.camera_enabled: + # 创建相机显示组件并添加到上料区 + 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("下料区 - 暂无内容") @@ -54,7 +66,7 @@ class MainWindow(MainWindowUI): self.setCentralWidget(self.stacked_widget) # 连接信号和槽 - # self.connect_signals() + self.connect_signals() # 默认显示主页面 self.stacked_widget.setCurrentIndex(0) @@ -67,6 +79,18 @@ class MainWindow(MainWindowUI): 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): # 连接菜单动作 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.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): """初始化界面数据""" # 设置订单和批号 self.order_edit.setText("ORD-2025-001") - self.tray_edit.setText("BAT-2025-001") + self.tray_edit.setCurrentText("托盘1") # 初始化项目表格数据示例 project_data = [ @@ -96,8 +121,8 @@ class MainWindow(MainWindowUI): ] for row in range(4): - for col in range(1, 5): # 从第2列开始(跳过项目列) - item = QTableWidgetItem(project_data[row][col-1]) + for col in range(0, 4): # 从第2列开始(跳过项目列) + item = QTableWidgetItem(project_data[row][col]) # item.setTextAlignment(Qt.AlignCenter) # 设置文本居中对齐 self.project_table.setItem(row, col, item) @@ -112,36 +137,40 @@ class MainWindow(MainWindowUI): 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() + # 只有在相机启用时处理相机显示 + if self.camera_enabled and hasattr(self, 'camera_display'): + # 如果相机已连接,直接开始显示相机画面 + 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) + # 只有在相机启用时才创建相机设置组件 + if self.camera_enabled: + # 延迟创建相机设置组件 + 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) + else: + # 如果相机未启用,显示提示信息 + QMessageBox.information(self, "设置", "相机功能已在配置文件中禁用,无法打开相机设置页面。") - # 切换到设置页面 - 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, "操作提示", "开始上料操作") # 这里添加上料相关的业务逻辑 @@ -155,9 +184,11 @@ class MainWindow(MainWindowUI): """处理开始按钮点击事件""" logging.info("开始按钮被点击") - # 开始显示相机画面 - if self.camera_display.camera_manager.isOpen: - self.camera_display.start_display() + # 只有在相机启用时处理相机显示 + if self.camera_enabled and hasattr(self, 'camera_display'): + # 开始显示相机画面 + if self.camera_display.camera_manager.isOpen: + self.camera_display.start_display() QMessageBox.information(self, "操作提示", "生产线已启动") # 这里添加启动生产线的业务逻辑 @@ -166,8 +197,10 @@ class MainWindow(MainWindowUI): """处理暂停按钮点击事件""" logging.info("暂停按钮被点击") - # 停止显示相机画面 - self.camera_display.stop_display() + # 只有在相机启用时处理相机显示 + if self.camera_enabled and hasattr(self, 'camera_display'): + # 停止显示相机画面 + self.camera_display.stop_display() QMessageBox.information(self, "操作提示", "生产线已暂停") # 这里添加暂停生产线的业务逻辑 @@ -206,8 +239,10 @@ class MainWindow(MainWindowUI): 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() \ No newline at end of file