<p>未经测试,但可能是这样的。注意,在您的代码中,您正在调用<code>Window</code>和<code>PhotoViewer</code>类的方法,但没有构造这些类的实例。你知道吗</p>
<ol>
<li><p>如果希望能够引用这些实例的方法/属性,则需要在它们的父/子类实例中实例化并保留这些实例。</p></li>
<li><p>正如我在上面的评论中所指出的,<code>Window.printfromwindow(self)</code>不应该有<code>self</code>参数(而是应该引用<code><instance of Window>.printfromwindow()</code>)。</p></li>
</ol>
<p>在<code>Window</code>构造函数中,我将<code>self.viewer</code>分配给<code>PhotoViewer</code>类的一个实例,并将<code>self</code>(它是<code>Window</code>实例)作为<code>parent</code>参数传递给它的构造函数。你知道吗</p>
<p>然后,在<code>PhotoViewer</code>类构造函数中,我们执行<code>self.window = parent</code>,它应该允许您调用<code>self.window.printfromwindow()</code>:</p>
<pre><code>class PhotoViewer(QtWidgets.QGraphicsView):
photoClicked = QtCore.pyqtSignal(QtCore.QPoint)
rectChanged = pyqtSignal(QRect)
def __init__(self, parent):
super(PhotoViewer, self).__init__(parent)
self.window = parent # relates the "parent" Window instance to this "child" PhotoViewer instance
self.window.printfromwindow() # calls the printfromwindow method from the "parent" Window instance
class Window(QtWidgets.QWidget):
def __init__(self):
super(Window, self).__init__()
self.print_this='test'
self.viewer = PhotoViewer(self) # creates an instance of PhotoViewer class as an attribute of this Window instance
def printfromwindow(self):
print(self.print_this)
</code></pre>
<p>如果您想使它更容易使用(即,不只是从<code>PhotoViewer</code>的构造函数中),那么将<code>Window.printfromwindow</code>分配给<code>PhotoViewer</code>的属性,如下所示:</p>
<pre><code>class PhotoViewer(QtWidgets.QGraphicsView):
photoClicked = QtCore.pyqtSignal(QtCore.QPoint)
rectChanged = pyqtSignal(QRect)
def __init__(self, parent):
super(PhotoViewer, self).__init__(parent)
self.window = parent # relates the "parent" Window instance to this "child" PhotoViewer instance
self.printfromwindow = self.window.printfromwindow
class Window(QtWidgets.QWidget):
def __init__(self):
super(Window, self).__init__()
self.print_this='test'
self.viewer = PhotoViewer(self) # creates an instance of PhotoViewer class as an attribute of this Window instance
def printfromwindow(self):
print(self.print_this)
</code></pre>
<p>由于函数是python中的一级对象,因此可以执行以下操作:</p>
<pre><code>app = QtWidgets.QApplication(sys.argv)
window = Window()
window.viewer.printfromwindow()
</code></pre>