大屏分屏控制软件
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
4.3 KiB

# 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;")