[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.config = self.load_config()
# 初始化服务
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.config = self.load_config()
# 设置通道显示数量
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_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.create_filter_widget()
print("create_filter_widget")
self.setup_connections()
def load_config(self):
@ -140,7 +139,7 @@ if __name__ == '__main__':
app = QApplication(sys.argv)
main_window = MainWindow()
logger.info("开始添加测试卡片")
logger.info("软件启动")
# for i in range(1, 6):
# data = CardData(
# 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_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):
"""初始化表格设置"""
self.header_view = SCheckBoxHeaderView(0, Qt.Horizontal)
@ -918,11 +993,17 @@ class AudioFilterWidget(QWidget):
def updateUI(self):
"""手动触发UI更新"""
if hasattr(self, 'model'):
# 清空现有数据
self.clear_ui_data()
# 从模型更新数据
self.set_all_params(self.model.to_widget_params())
# 断开所有信号连接
self.disconnect_all_signals()
try:
# 清空现有数据
self.clear_ui_data()
# 从模型更新数据
self.set_all_params(self.model.to_widget_params())
finally:
# 确保信号总是被重新连接,即使发生异常
self.connect_param_signals()
def clear_ui_data(self):
"""清空UI中的所有数据"""
# 清空基础参数
@ -944,27 +1025,6 @@ class AudioFilterWidget(QWidget):
self.ui.verticalSlider_3.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__":
import sys

View File

@ -187,52 +187,38 @@ class AudioFilterController(QObject):
try:
self.state = AudioControllerState.UPDATING
struct_data = res.data
print("struct_data:", struct_data)
print("\n")
# 将结构体数据转换为模型数据
model_data = self._convert_struct_data_to_model(struct_data)
# 暂时断开widget的信号连接
if self.widget:
self.widget.disconnect_param_signals()
# 更新通道参数
self.model.set_channel_params(model_data['channel_params'])
try:
# 清除UI数据
self.widget.clear_ui_data()
# 清除现有滤波器
self.model.filters.clear()
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
])
]
# 更新通道参数
self.model.set_channel_params(model_data['channel_params'])
# 更新model的filters列表
self.model.filters = valid_filters
# 清除现有滤波器
self.model.filters.clear()
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.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()
print("有效的滤波器数量:", len(self.model.filters))
# 使用widget的updateUI方法来更新UI
if self.widget:
self.widget.updateUI()
self.state = AudioControllerState.IDLE
except Exception as e:
self.state = AudioControllerState.ERROR

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