[bugfix] 调整updateUI内部逻辑,新增信号断开重连机制

This commit is contained in:
Sam 2025-02-24 09:38:33 +08:00
parent f4c197f7f2
commit 59dbf276b8
26 changed files with 118 additions and 73 deletions

13
app.py
View File

@ -29,10 +29,6 @@ class MainWindow(QWidget):
# 初始化日志系统 # 初始化日志系统
self.log_handler = setup_logger() self.log_handler = setup_logger()
# 加载配置文件
self.config = self.load_config()
# 初始化服务 # 初始化服务
ServiceManager.instance().init_services("192.168.5.4", 12345) ServiceManager.instance().init_services("192.168.5.4", 12345)
# 初始化应用控制器 # 初始化应用控制器
@ -46,9 +42,13 @@ class MainWindow(QWidget):
# 设置日志处理器的目标窗口 # 设置日志处理器的目标窗口
self.log_handler.set_widget(self.widget_log) self.log_handler.set_widget(self.widget_log)
# 加载配置文件
self.config = self.load_config()
# 设置通道显示数量 # 设置通道显示数量
channel_count = self.config['channels']['count'] channel_count = self.config['channels']['count']
print(f"channel_count: {channel_count}") logger.info(f"通道数量: {channel_count}")
self.widget_channel.set_visible_channels(channel_count) self.widget_channel.set_visible_channels(channel_count)
self.widget_main.ui.ListWidget_vLayout.addWidget(self.widget_card) self.widget_main.ui.ListWidget_vLayout.addWidget(self.widget_card)
@ -64,7 +64,6 @@ class MainWindow(QWidget):
self.widget_main.ui.ListWidget_vLayout.addWidget(self.test_button) self.widget_main.ui.ListWidget_vLayout.addWidget(self.test_button)
self.create_filter_widget() self.create_filter_widget()
print("create_filter_widget")
self.setup_connections() self.setup_connections()
def load_config(self): def load_config(self):
@ -140,7 +139,7 @@ if __name__ == '__main__':
app = QApplication(sys.argv) app = QApplication(sys.argv)
main_window = MainWindow() main_window = MainWindow()
logger.info("开始添加测试卡片") logger.info("软件启动")
# for i in range(1, 6): # for i in range(1, 6):
# data = CardData( # data = CardData(
# name=f"测试项目 {i}", # name=f"测试项目 {i}",

View File

@ -531,6 +531,81 @@ class AudioFilterWidget(QWidget):
self.ui.pushButton.clicked.connect(lambda: self.send_params_clicked.emit()) self.ui.pushButton.clicked.connect(lambda: self.send_params_clicked.emit())
# self.ui.pushButton_10.clicked.connect(lambda: self.get_params_clicked.emit()) # self.ui.pushButton_10.clicked.connect(lambda: self.get_params_clicked.emit())
def disconnect_all_signals(self):
"""安全地断开所有UI信号连接"""
# 断开参数输入框信号
try:
self.ui.lineEdit_11.textChanged.disconnect()
self.ui.lineEdit_10.textChanged.disconnect()
self.ui.lineEdit_13.textChanged.disconnect()
self.ui.lineEdit_12.textChanged.disconnect()
except TypeError:
# 信号可能未连接,忽略错误
pass
# 断开滑块信号
try:
self.ui.verticalSlider.valueChanged.disconnect()
self.ui.verticalSlider_2.valueChanged.disconnect()
self.ui.verticalSlider_3.valueChanged.disconnect()
self.ui.verticalSlider_4.valueChanged.disconnect()
except TypeError:
pass
# 断开表格信号
try:
self.ui.tableWidget.itemSelectionChanged.disconnect()
self.ui.tableWidget.itemChanged.disconnect()
except TypeError:
pass
# 断开按钮信号
try:
self.ui.pushButton_7.clicked.disconnect() # 添加滤波器按钮
self.ui.pushButton_8.clicked.disconnect() # 删除滤波器按钮
self.ui.pushButton.clicked.disconnect() # 发送参数按钮
except TypeError:
pass
def connect_param_signals(self):
"""重新连接所有UI信号"""
# 连接参数输入框信号
self.ui.lineEdit_11.textChanged.connect(
lambda v: self._on_param_changed('delay', v)
)
self.ui.lineEdit_10.textChanged.connect(
lambda v: self._on_param_changed('volume', v)
)
self.ui.lineEdit_13.textChanged.connect(
lambda v: self._on_param_changed('mix_right', v)
)
self.ui.lineEdit_12.textChanged.connect(
lambda v: self._on_param_changed('mix_left', v)
)
# 连接滑块信号
self.ui.verticalSlider.valueChanged.connect(
lambda v: self._on_slider_changed('freq', v)
)
self.ui.verticalSlider_2.valueChanged.connect(
lambda v: self._on_slider_changed('q', v)
)
self.ui.verticalSlider_3.valueChanged.connect(
lambda v: self._on_slider_changed('gain', v)
)
self.ui.verticalSlider_4.valueChanged.connect(
lambda v: self._on_slider_changed('slope', v)
)
# 连接表格信号
self.ui.tableWidget.itemSelectionChanged.connect(self._on_selection_changed)
self.ui.tableWidget.itemChanged.connect(self._on_table_item_changed)
# 连接按钮信号
self.ui.pushButton_7.clicked.connect(self._on_add_filter_clicked)
self.ui.pushButton_8.clicked.connect(self._on_delete_filter_clicked)
self.ui.pushButton.clicked.connect(lambda: self.send_params_clicked.emit())
def setup_table(self): def setup_table(self):
"""初始化表格设置""" """初始化表格设置"""
self.header_view = SCheckBoxHeaderView(0, Qt.Horizontal) self.header_view = SCheckBoxHeaderView(0, Qt.Horizontal)
@ -918,11 +993,17 @@ class AudioFilterWidget(QWidget):
def updateUI(self): def updateUI(self):
"""手动触发UI更新""" """手动触发UI更新"""
if hasattr(self, 'model'): if hasattr(self, 'model'):
# 清空现有数据 # 断开所有信号连接
self.clear_ui_data() self.disconnect_all_signals()
# 从模型更新数据 try:
self.set_all_params(self.model.to_widget_params()) # 清空现有数据
self.clear_ui_data()
# 从模型更新数据
self.set_all_params(self.model.to_widget_params())
finally:
# 确保信号总是被重新连接,即使发生异常
self.connect_param_signals()
def clear_ui_data(self): def clear_ui_data(self):
"""清空UI中的所有数据""" """清空UI中的所有数据"""
# 清空基础参数 # 清空基础参数
@ -944,27 +1025,6 @@ class AudioFilterWidget(QWidget):
self.ui.verticalSlider_3.setValue(0) self.ui.verticalSlider_3.setValue(0)
self.ui.verticalSlider_4.setValue(0) self.ui.verticalSlider_4.setValue(0)
def disconnect_param_signals(self):
"""断开参数信号连接"""
self.ui.lineEdit_11.textChanged.disconnect()
self.ui.lineEdit_10.textChanged.disconnect()
self.ui.lineEdit_13.textChanged.disconnect()
self.ui.lineEdit_12.textChanged.disconnect()
def connect_param_signals(self):
"""重新连接参数信号"""
self.ui.lineEdit_11.textChanged.connect(
lambda v: self._on_param_changed('delay', v)
)
self.ui.lineEdit_10.textChanged.connect(
lambda v: self._on_param_changed('volume', v)
)
self.ui.lineEdit_13.textChanged.connect(
lambda v: self._on_param_changed('mix_right', v)
)
self.ui.lineEdit_12.textChanged.connect(
lambda v: self._on_param_changed('mix_left', v)
)
if __name__ == "__main__": if __name__ == "__main__":
import sys import sys

View File

@ -187,52 +187,38 @@ class AudioFilterController(QObject):
try: try:
self.state = AudioControllerState.UPDATING self.state = AudioControllerState.UPDATING
struct_data = res.data struct_data = res.data
print("struct_data:", struct_data)
print("\n")
# 将结构体数据转换为模型数据 # 将结构体数据转换为模型数据
model_data = self._convert_struct_data_to_model(struct_data) model_data = self._convert_struct_data_to_model(struct_data)
# 暂时断开widget的信号连接 # 更新通道参数
if self.widget: self.model.set_channel_params(model_data['channel_params'])
self.widget.disconnect_param_signals()
try: # 清除现有滤波器
# 清除UI数据 self.model.filters.clear()
self.widget.clear_ui_data()
if model_data['channel_id'] == self.model.channel_id:
# 只添加有效的滤波器所有参数都不为0
valid_filters = [
filter_param for filter_param in model_data['filters']
if any([
filter_param.frequency != 0,
filter_param.q_value != 0,
filter_param.gain != 0,
filter_param.slope != 0
])
]
# 更新通道参数 # 更新model的filters列表
self.model.set_channel_params(model_data['channel_params']) self.model.filters = valid_filters
# 清除现有滤波器 print("有效的滤波器数量:", len(self.model.filters))
self.model.filters.clear()
# 使用widget的updateUI方法来更新UI
if model_data['channel_id'] == self.model.channel_id: if self.widget:
# 只添加有效的滤波器所有参数都不为0 self.widget.updateUI()
valid_filters = [
filter_param for filter_param in model_data['filters'] self.state = AudioControllerState.IDLE
if any([
filter_param.frequency != 0,
filter_param.q_value != 0,
filter_param.gain != 0,
filter_param.slope != 0
])
]
# 更新model的filters列表
self.model.filters = valid_filters
print("有效的滤波器数量:", len(self.model.filters))
print(f"bbbbb, self.model.channel_params:{self.model.channel_params}")
# 从模型更新数据
print(f"aaaaa to_widget_params:{self.model.to_widget_params()}")
self.widget.set_all_params(self.model.to_widget_params())
finally:
# 恢复widget的信号连接
if self.widget:
self.widget.connect_param_signals()
except Exception as e: except Exception as e:
self.state = AudioControllerState.ERROR self.state = AudioControllerState.ERROR

@ -1 +1 @@
Subproject commit 5d3fc10c5ddbadfb5b8cd4825355fbabc9a42438 Subproject commit 0e1cec2c5ddf5e17a624d18d503b8a41cac38def