# panel/connection_panel.py from PyQt5.QtWidgets import (QGroupBox, QFormLayout, QHBoxLayout, QComboBox, QPushButton, QLabel, QVBoxLayout) from PyQt5.QtCore import Qt from core.connection_manager import SerialManager from utils.logger import logger class ConnectionPanel(QGroupBox): def __init__(self, serial_manager): super().__init__("设备连接管理") self.setTitle("🔗 设备连接") # 实例化核心管理器 # self.serial_manager = SerialManager() self.serial_manager = serial_manager self.init_ui() def init_ui(self): # 主布局 main_layout = QVBoxLayout() # 表单布局(用于参数行) form_layout = QFormLayout() # --- 1. 端口选择行 --- self.port_combo = QComboBox() self.refresh_btn = QPushButton("🔄 刷新") self.refresh_btn.setFixedWidth(80) port_hbox = QHBoxLayout() port_hbox.addWidget(self.port_combo) port_hbox.addWidget(self.refresh_btn) form_layout.addRow("串口端口:", port_hbox) # --- 2. 波特率选择 --- self.baud_combo = QComboBox() self.baud_combo.addItems(["9600", "19200", "38400", "115200"]) self.baud_combo.setCurrentText("9600") form_layout.addRow("波特率:", self.baud_combo) # --- 3. 连接状态行 --- self.status_label = QLabel("●") self.status_label.setStyleSheet("color: red; font-size: 20px;") self.status_text = QLabel("离线") status_hbox = QHBoxLayout() status_hbox.addWidget(self.status_label) status_hbox.addWidget(self.status_text) form_layout.addRow("连接状态:", status_hbox) # 将表单加入主布局 main_layout.addLayout(form_layout) # --- 4. 连接按钮 --- self.connect_btn = QPushButton("✅ 连接设备") self.connect_btn.setStyleSheet("font-weight: bold; padding: 5px;") main_layout.addWidget(self.connect_btn, alignment=Qt.AlignCenter) self.setLayout(main_layout) # --- 信号连接 --- self.refresh_btn.clicked.connect(self.refresh_ports) self.connect_btn.clicked.connect(self.toggle_connection) # 初始化时自动扫描一次 self.refresh_ports() def refresh_ports(self): """ 刷新下拉框中的端口列表 """ self.port_combo.clear() ports = self.serial_manager.get_available_ports() if ports: self.port_combo.addItems(ports) logger.debug(f"🔍 扫描到串口: {ports}") else: self.port_combo.addItem("未检测到设备") logger.warning("⚠️ 未扫描到任何串口设备") def toggle_connection(self): """ 切换连接/断开状态 """ # ... 连接成功后 ... print(f"连接面板中的 serial_manager 对象: {id(self.serial_manager)}") print(f"连接面板中的 is_connected 状态: {self.serial_manager.is_connected}") if self.serial_manager.is_connected: self.serial_manager.disconnect() self.update_ui_state(False) else: port = self.port_combo.currentText() baudrate = int(self.baud_combo.currentText()) if port == "未检测到设备": logger.error("❌ 无法连接:请插入设备并点击刷新") return # 尝试连接 success = self.serial_manager.connect(port=port, baudrate=baudrate) if success: self.update_ui_state(True) # 失败信息由 SerialManager 内部记录 def update_ui_state(self, connected): """ 根据连接状态更新按钮和文字 """ if connected: self.status_label.setStyleSheet("color: green;") self.status_text.setText("在线") self.connect_btn.setText("🛑 断开连接") self.connect_btn.setStyleSheet("font-weight: bold; background-color: #d3f3d3; padding: 5px;") else: self.status_label.setStyleSheet("color: red;") self.status_text.setText("离线") self.connect_btn.setText("✅ 连接设备") self.connect_btn.setStyleSheet("font-weight: bold; padding: 5px;")