<p>我认为这里可以使用两种不同的方法:使<code>A</code>和<code>B</code>类紧密耦合,或者使用主窗口作为中介。</p>
<p>在第一种情况下,您必须“让<code>A</code>知道<code>B</code>”,这意味着<code>A</code>引用了<code>B</code>。在这种情况下,您甚至根本不需要执行signals&slot操作,只需直接调用<code>B</code>的方法即可。</p>
<p>另一种方法是让<code>A</code>发出一个带有参数</em>的信号<em>,该参数包含<code>B</code>应接收的数据,主窗口捕获该信号并用该数据调用<code>B</code>。
或者,您可以将数据放在<code>A</code>的属性中,让主窗口直接从这里获取数据,而不将其作为信号参数传递。</p>
<p>后一种方法允许您更自由地编写<code>A</code>和<code>B</code>,因为<code>A</code>不需要知道如何调用<code>B</code>。</p>
<p>在代码中解释如下:</p>
<pre><code>class A(QWidget):
the_signal = Signal(...)
def mouseReleaseEvent(self, event):
self.a_function()
self.the_data = self.produce_data()
self.the_signal.emit()
class B(QWidget):
def process_data(self, data):
pass
class MainWindow(QMainWindow):
def __init__(self):
self.a_widget = A()
self.b_widget = B()
self.a_widget.the_signal.connect(self.do_process)
# if the signal has the data as argument:
# self.a_widget.the_signal.connect(self.b_widget.process_data)
def do_process(self):
self.b_widget.process_data(self.a_widget.the_data)
</code></pre>