要在基于pyqt5的应用程序中使用,我想提出一种将对象的属性绑定到QWidget的机制(单向-以便通过<属性的任意更新触发qt小部件上的更新strong>另一个对象)。
我想使表示的类不知道其表示形式,以便可以与其他GUI框架等重用。
由于这个原因,使用信号/插槽的解决方案并不理想,因为所表示的类需要继承自QObject才能定义和发出信号(QWidget类可以捕获该信号)。
我能找出的最好的方法如下,其中A是表示的类,B是表示的类(将从QWidget继承,但为简单起见,在示例中可以忽略)
class A:
def __init__(self):
self._prop = 0
@property
def prop(self):
print("getting prop from A")
return self._prop
@prop.setter
def prop(self, v):
print("setting prop from A")
self._prop = v
class B:
def __init__(self, a):
a_getter = type(a).prop.fget
a_setter = type(a).prop.fset
def b_getter(obj):
a_getter(obj)
print("B's hook in A - getter")
def b_setter(obj, v):
a_setter(obj, v)
print("B's hook in A - setter")
type(a).prop = property(b_getter, b_setter)
在初始化过程中,B获得了它应该表示的A的实例,并通过添加一些操作(对gui的更新)来“扩展” A的prop
getter和setter。
用途为:
>>> a = A()
>>> a.prop
getting prop from A
>>> a.prop = 1
setting prop from A
>>> b = B(a)
>>> a.prop
getting prop from A
B's hook in A - getter
>>> a.prop = 2
setting prop from A
B's hook in A - setter
此解决方案似乎可以正常工作,但我不确定修改classe属性的整个想法是否是个好/安全的想法。
是否存在一种更好的方法来实现相同的效果,同时保持“代表-代表”的分离?您对我提出的解决方案有任何疑问吗?