PyQt独立模块窗口访问主模块my_settings对象属性的问题咨询
核心问题原因
- 你实例化的
my_settings属于主模块的全局变量,独立模块默认没有该对象的引用,因此无法直接访问 - Qt的
connect方法仅接收槽函数对象作为参数,不能直接在括号内追加自定义参数,你之前的传参写法不符合信号槽的调用规则
推荐解决方案:构造函数传参
这是耦合度最低、最易维护的实现方式,直接在实例化子窗口时将my_settings作为参数传入,存为子窗口的实例属性后,类内所有方法都可以正常访问:
主模块修改代码
def open_some_widget(self): # 实例化子窗口时额外传入my_settings对象 widget = widget_in_other_module(self, my_settings) widget.exec_()
独立模块修改代码
class widget_in_other_module(QDialog): # 构造函数新增my_settings接收参数 def __init__(self, parent, my_settings): QDialog.__init__(self, parent) # 存为实例属性,类内全域可访问 self.my_settings = my_settings self.parent = parent self.my_settings.temppath = self.my_settings.OutputDir self.my_settings.some_attribute = foo uic.loadUi("some.ui", self) self.pushButtonOpenMain.clicked.connect(self.openMain) def openMain(self): # 直接通过实例属性修改设置 self.my_settings.some_other_attibute = bar
补充:Qt信号槽传自定义参数的正确写法
如果你后续有给槽函数传额外参数的需求,可以用lambda匿名函数或者functools.partial实现,示例:
from functools import partial # 写法1:使用lambda self.pushButtonOpenMain.clicked.connect(lambda: self.openMain(自定义参数)) # 写法2:使用partial self.pushButtonOpenMain.clicked.connect(partial(self.openMain, 自定义参数))
不推荐的替代方案:你也可以在独立模块顶部导入主模块的
my_settings对象,但该方式容易引发循环导入问题,且代码耦合度高,可维护性远低于构造函数传参方案。
内容的提问来源于stack exchange,提问作者A Rob4
相关产品推荐
相关产品推荐

