Python PyQt多窗口-如何在Qt设计器模块之间传递函数

Python PyQt多窗口-如何在Qt设计器模块之间传递函数,python,pyqt,qt-designer,Python,Pyqt,Qt Designer,我将从问题开始,然后尝试解释: 导入的模块是否有方法调用导入它的模块中的函数 我正在学习使用Qt,并从Qt Designer开始学习一些基础知识 我已经了解了如何创建多个“.ui”文件以获取多个窗口的代码,并通过导入两个窗口的代码,设法了解了如何从主应用程序调用多个窗口 例如,从win1.ui和win2.ui开始,我创建win1.py和win2.py-从我的主应用程序导入win1和win2 注意-我通过以下简单教程做到了这一点: 好,现在是问题。如果我在win2中有一个按钮,我知道如何将该按钮链

我将从问题开始,然后尝试解释: 导入的模块是否有方法调用导入它的模块中的函数

我正在学习使用Qt,并从Qt Designer开始学习一些基础知识

我已经了解了如何创建多个“.ui”文件以获取多个窗口的代码,并通过导入两个窗口的代码,设法了解了如何从主应用程序调用多个窗口

例如,从win1.ui和win2.ui开始,我创建win1.py和win2.py-从我的主应用程序导入win1和win2

注意-我通过以下简单教程做到了这一点:

好,现在是问题。如果我在win2中有一个按钮,我知道如何将该按钮链接到win2.py代码中的函数。我不知道如何将win2中的按钮链接到我的主应用程序中的函数

我唯一的想法是在设置第二个窗口的类中添加一个函数作为参数,但是如果我这样做,那么对win2.ui的任何更改都会破坏我所更改的代码

因此,导入的模块是否有方法调用导入它的模块中的函数


我希望这一点很清楚,不要添加一堆不相关的代码。

Qt基于事件驱动编程。通常,当您开始构建小部件时,您想要做的是通过信号向接收器小部件提供信息,然后对这些信号进行处理。您不希望显式地让子小部件知道或要求调用父小部件上的方法(这种情况并不总是的,但最好尽可能避免)

我将在这里发布一些没有UI文件的示例,但假设您可以使用designer构建相同的小部件,并以相同的方式工作

testwidget.py

testwindow.py

因此,这里您可以看到,您不需要像“当我单击TestWidget中的按钮时,我想在TestWindow中显示一条消息”并显式链接这两个方法,而是公开一个信号,当用户执行某个操作时TestWidget将发出该信号,然后将该信号连接到TestWindow的showMessage插槽。这样,您的小部件变得更加独立,更重要的是如何连接到驱动应用程序的每个事件


我本可以在TestWidget的emitTextSaved方法中执行类似self.parent().showMessage(self.\u edit.toPlainText())的操作来直接调用该方法-但这不是一个好的设计。

谢谢-我需要一段时间来完成这项工作,但这个想法似乎很简单。我看到TestWidget发出的信号,但我看不到TestWindow是如何得到消息的。我将输入所有代码并从中计算出来…行:self.\uu editor.textSaved.connect(self.showMessage)正在创建从textSaved信号到showMessage插槽的连接。它使用PyQt的新型连接语法。因此,您不会在生成信号的模块(或类)中连接信号,而是在第二个类中首先引用信号后将插槽连接到信号。。。不是很直观:-(我真的很难把这些点连接起来,但它们正在结合在一起。再次感谢!所以实际发生的事情是当信号发出时,它会通过并运行注册到它的每个方法。当信号发出时,你可以连接任意数量的方法来运行。因此,将连接视为注册回调方法。Eric-我的意思是我们试图实现的目标是使一个窗口/小部件能够对另一个窗口/小部件产生影响。在本例中,您将第二个小部件加载到TestWindow类中。如何在不“包含”彼此的对象之间建立连接?
from PyQt4 import QtGui, QtCore

class TestWidget(QtGui.QWidget):
    textSaved = QtCore.pyqtSignal(str)

    def __init__( self, parent = None ):
        super(TestWidget, self).__init__(parent)

        # create the ui (or load it)
        self.__edit   = QtGui.QTextEdit(self)
        self.__button = QtGui.QPushButton(self)
        self.__button.setText('Save')

        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.__edit)
        layout.addWidget(self.__button)
        self.setLayout(layout)

        # create connections
        self.__button.clicked.connect(self.emitTextSaved)

    def emitTextSaved( self ):
        # allow Qt's blocking of signals paradigm to control flow
        if ( not self.signalsBlocked() ):
            self.textSaved.emit(self.__edit.toPlainText())
from PyQt4 import QtGui, QtCore
import testwidget

class TestWindow(QtGui.QMainWindow):
    def __init__( self, parent == None ):
        super(TestWindow, self).__init__(parent)

        # create the ui (or load it)
        self.__editor = testwidget.TestWidget(self)
        self.setCentralWidget(self.__editor)

        # create connections
        self.__editor.textSaved.connect(self.showMessage)

    def showMessage( self, message ):
        QtGui.QMessageBox.information(self, 'Message', message)