<p>我已经为一个pyqt项目设计了一个小型的通用双向绑定框架。这是:<a href="https://gist.github.com/jkokorian/31bd6ea3c535b1280334#file-pyqt2waybinding" rel="nofollow">https://gist.github.com/jkokorian/31bd6ea3c535b1280334#file-pyqt2waybinding</a></p>
<p>下面是一个如何使用它的例子(也包括在要点中):</p>
<h3>模型(非gui)类</h3>
<pre><code>class Model(q.QObject):
"""
A simple model class for testing
"""
valueChanged = q.pyqtSignal(int)
def __init__(self):
q.QObject.__init__(self)
self.__value = 0
@property
def value(self):
return self.__value
@value.setter
def value(self, value):
if (self.__value != value):
self.__value = value
print "model value changed to %i" % value
self.valueChanged.emit(value)
</code></pre>
<h3>QWidget(gui)类</h3>
<pre><code>class TestWidget(qt.QWidget):
"""
A simple GUI for testing
"""
def __init__(self):
qt.QWidget.__init__(self,parent=None)
layout = qt.QVBoxLayout()
self.model = Model()
spinbox1 = qt.QSpinBox()
spinbox2 = qt.QSpinBox()
button = qt.QPushButton()
layout.addWidget(spinbox1)
layout.addWidget(spinbox2)
layout.addWidget(button)
self.setLayout(layout)
#create the 2-way bindings
valueObserver = Observer()
self.valueObserver = valueObserver
valueObserver.bindToProperty(spinbox1, "value")
valueObserver.bindToProperty(spinbox2, "value")
valueObserver.bindToProperty(self.model, "value")
button.clicked.connect(lambda: setattr(self.model,"value",10))
</code></pre>
<p><code>Observer</code>实例绑定到<code>QSpinBox</code>实例的<code>valueChanged</code>信号,并使用setValue方法更新该值。它还了解如何绑定到python属性,假设绑定端点实例上有相应的propertyNameChanged(命名约定)pyqtSignal。</p>
<p><strong>更新</strong>我对它更感兴趣,并为它创建了一个合适的存储库:<a href="https://github.com/jkokorian/pyqt2waybinding" rel="nofollow">https://github.com/jkokorian/pyqt2waybinding</a></p>
<p>要安装:</p>
<pre><code>pip install pyqt2waybinding
</code></pre>