2025-06-12 17:29:35 +08:00
|
|
|
|
import logging
|
|
|
|
|
|
from PySide6.QtCore import Signal
|
|
|
|
|
|
from PySide6.QtWidgets import QDialog, QVBoxLayout, QDialogButtonBox
|
|
|
|
|
|
from widgets.serial_settings_widget import SerialSettingsWidget
|
|
|
|
|
|
from widgets.settings_widget import SettingsWidget
|
2025-06-26 18:26:22 +08:00
|
|
|
|
from ui.electricity_settings_ui import ElectricitySettingsUI
|
2025-06-12 17:29:35 +08:00
|
|
|
|
|
|
|
|
|
|
class SettingsWindow(QDialog):
|
|
|
|
|
|
"""设置窗口,直接使用SettingsWidget中的标签页"""
|
|
|
|
|
|
|
|
|
|
|
|
# 定义信号
|
|
|
|
|
|
settings_changed = Signal()
|
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, parent=None):
|
|
|
|
|
|
super().__init__(parent)
|
|
|
|
|
|
logging.info("正在初始化SettingsWindow")
|
|
|
|
|
|
|
|
|
|
|
|
# 设置窗口标题和大小
|
|
|
|
|
|
self.setWindowTitle("系统设置")
|
|
|
|
|
|
self.resize(900, 700)
|
|
|
|
|
|
self.setModal(True)
|
|
|
|
|
|
|
|
|
|
|
|
# 创建主布局
|
|
|
|
|
|
main_layout = QVBoxLayout(self)
|
|
|
|
|
|
main_layout.setContentsMargins(10, 10, 10, 10)
|
|
|
|
|
|
|
|
|
|
|
|
# 创建设置部件
|
|
|
|
|
|
self.settings_widget = SettingsWidget(self)
|
|
|
|
|
|
main_layout.addWidget(self.settings_widget)
|
|
|
|
|
|
|
2025-06-27 15:14:30 +08:00
|
|
|
|
# 应用相机刷新按钮修复
|
|
|
|
|
|
try:
|
|
|
|
|
|
# 先尝试直接找到刷新按钮并添加事件处理
|
|
|
|
|
|
logging.info("尝试直接查找刷新按钮并添加事件处理...")
|
|
|
|
|
|
from PySide6.QtWidgets import QPushButton
|
|
|
|
|
|
|
|
|
|
|
|
# 在整个UI层次中查找刷新设备按钮
|
|
|
|
|
|
refresh_buttons = []
|
|
|
|
|
|
for widget in self.findChildren(QPushButton):
|
|
|
|
|
|
if widget.text() == "刷新设备":
|
|
|
|
|
|
refresh_buttons.append(widget)
|
|
|
|
|
|
|
|
|
|
|
|
if refresh_buttons:
|
|
|
|
|
|
logging.info(f"找到 {len(refresh_buttons)} 个刷新设备按钮")
|
|
|
|
|
|
for i, button in enumerate(refresh_buttons):
|
|
|
|
|
|
try:
|
|
|
|
|
|
# 断开现有连接
|
|
|
|
|
|
button.clicked.disconnect()
|
|
|
|
|
|
except Exception:
|
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
# 连接到相机设置的刷新方法
|
|
|
|
|
|
if hasattr(self.settings_widget, 'camera_settings') and hasattr(self.settings_widget.camera_settings, 'refresh_devices'):
|
|
|
|
|
|
button.clicked.connect(self.settings_widget.camera_settings.refresh_devices)
|
|
|
|
|
|
logging.info(f"已将刷新按钮 #{i+1} 连接到refresh_devices方法")
|
|
|
|
|
|
|
|
|
|
|
|
# 尝试调用一次
|
|
|
|
|
|
self.settings_widget.camera_settings.refresh_devices()
|
|
|
|
|
|
logging.info("已手动调用refresh_devices方法初始化设备列表")
|
|
|
|
|
|
|
|
|
|
|
|
# 使用导入的修复模块作为备选方案
|
|
|
|
|
|
try:
|
|
|
|
|
|
# 使用相对导入,更可靠
|
|
|
|
|
|
from . import refresh_devices_fix
|
|
|
|
|
|
refresh_devices_fix.fix_camera_refresh_button(self.settings_widget)
|
|
|
|
|
|
logging.info("已应用相机刷新按钮修复(通过相对导入)")
|
|
|
|
|
|
except ImportError:
|
|
|
|
|
|
# 如果相对导入失败,尝试绝对导入
|
|
|
|
|
|
try:
|
|
|
|
|
|
import refresh_devices_fix
|
|
|
|
|
|
refresh_devices_fix.fix_camera_refresh_button(self.settings_widget)
|
|
|
|
|
|
logging.info("已应用相机刷新按钮修复(通过绝对导入)")
|
|
|
|
|
|
except ImportError:
|
|
|
|
|
|
# 如果绝对导入也失败,直接内联实现修复逻辑
|
|
|
|
|
|
logging.warning("导入refresh_devices_fix失败,使用内联修复")
|
|
|
|
|
|
self._fix_camera_refresh_button()
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
logging.error(f"应用相机刷新按钮修复失败: {str(e)}")
|
|
|
|
|
|
|
|
|
|
|
|
def _fix_camera_refresh_button(self):
|
|
|
|
|
|
"""内联实现的刷新按钮修复逻辑,用于导入模块失败的情况"""
|
|
|
|
|
|
try:
|
|
|
|
|
|
logging.info("使用内联方法修复相机刷新按钮...")
|
|
|
|
|
|
|
|
|
|
|
|
# 获取设置部件
|
|
|
|
|
|
settings_widget = self.settings_widget
|
|
|
|
|
|
|
|
|
|
|
|
# 确保相机设置组件存在
|
|
|
|
|
|
if not hasattr(settings_widget, 'camera_settings'):
|
|
|
|
|
|
logging.error("设置窗口中没有camera_settings属性")
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
# 查找刷新按钮
|
|
|
|
|
|
refresh_button = None
|
|
|
|
|
|
|
|
|
|
|
|
# 方法1: 在settings_widget上查找
|
|
|
|
|
|
if hasattr(settings_widget, 'refresh_button'):
|
|
|
|
|
|
refresh_button = settings_widget.refresh_button
|
|
|
|
|
|
logging.info("在settings_widget中找到刷新按钮")
|
|
|
|
|
|
# 方法2: 在camera_tab中查找
|
|
|
|
|
|
elif hasattr(settings_widget, 'camera_tab'):
|
|
|
|
|
|
from PySide6.QtWidgets import QPushButton
|
|
|
|
|
|
for child in settings_widget.camera_tab.findChildren(QPushButton):
|
|
|
|
|
|
if child.text() == "刷新设备":
|
|
|
|
|
|
refresh_button = child
|
|
|
|
|
|
logging.info("在camera_tab中找到刷新按钮")
|
|
|
|
|
|
break
|
|
|
|
|
|
# 方法3: 在camera_settings中查找
|
|
|
|
|
|
elif hasattr(settings_widget.camera_settings, 'refresh_button'):
|
|
|
|
|
|
refresh_button = settings_widget.camera_settings.refresh_button
|
|
|
|
|
|
logging.info("在camera_settings中找到刷新按钮")
|
|
|
|
|
|
|
|
|
|
|
|
# 如果找到按钮,则绑定事件
|
|
|
|
|
|
if refresh_button:
|
|
|
|
|
|
from PySide6.QtCore import QObject
|
|
|
|
|
|
if isinstance(refresh_button, QObject):
|
|
|
|
|
|
try:
|
|
|
|
|
|
# 断开现有连接
|
|
|
|
|
|
refresh_button.clicked.disconnect()
|
|
|
|
|
|
except:
|
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
# 连接到刷新方法
|
|
|
|
|
|
refresh_button.clicked.connect(settings_widget.camera_settings.refresh_devices)
|
|
|
|
|
|
logging.info("成功绑定刷新按钮到refresh_devices方法")
|
|
|
|
|
|
|
|
|
|
|
|
# 手动调用一次
|
|
|
|
|
|
settings_widget.camera_settings.refresh_devices()
|
|
|
|
|
|
logging.info("已手动调用refresh_devices初始化设备列表")
|
|
|
|
|
|
else:
|
|
|
|
|
|
logging.error(f"刷新按钮不是QObject: {type(refresh_button)}")
|
|
|
|
|
|
else:
|
|
|
|
|
|
logging.error("未找到刷新设备按钮")
|
|
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
logging.error(f"内联修复相机刷新按钮时发生错误: {str(e)}")
|
|
|
|
|
|
|
2025-06-12 17:29:35 +08:00
|
|
|
|
# 添加串口设置到标签页
|
|
|
|
|
|
self.serial_settings = SerialSettingsWidget(self)
|
|
|
|
|
|
self.settings_widget.tab_widget.addTab(self.serial_settings, "串口设置")
|
|
|
|
|
|
|
2025-06-26 18:26:22 +08:00
|
|
|
|
# 添加电力监控设置到标签页
|
|
|
|
|
|
self.electricity_settings = ElectricitySettingsUI(self)
|
|
|
|
|
|
self.settings_widget.tab_widget.addTab(self.electricity_settings, "电力监控")
|
|
|
|
|
|
|
2025-06-12 17:29:35 +08:00
|
|
|
|
# 添加按钮
|
|
|
|
|
|
self.button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
|
|
|
|
|
|
self.button_box.accepted.connect(self.accept)
|
|
|
|
|
|
self.button_box.rejected.connect(self.reject)
|
|
|
|
|
|
main_layout.addWidget(self.button_box)
|
|
|
|
|
|
|
|
|
|
|
|
# 连接信号
|
|
|
|
|
|
self.serial_settings.settings_changed.connect(self.settings_changed.emit)
|
2025-06-26 18:26:22 +08:00
|
|
|
|
self.electricity_settings.settings_changed.connect(self.settings_changed.emit)
|
2025-06-12 17:29:35 +08:00
|
|
|
|
|
|
|
|
|
|
logging.info("SettingsWindow初始化完成")
|
|
|
|
|
|
|
|
|
|
|
|
def accept(self):
|
|
|
|
|
|
"""确认按钮处理,保存所有设置并发送设置变更信号"""
|
|
|
|
|
|
# 通知设置已变更
|
|
|
|
|
|
self.settings_changed.emit()
|
|
|
|
|
|
|
|
|
|
|
|
# 调用父类方法关闭对话框
|
|
|
|
|
|
super().accept()
|