PyQt Multiple Windows - 如何在模块Qt Designer之间传递函数

时间:2012-08-21 18:54:44

标签: python pyqt qt-designer

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

我正在学习使用Qt,并开始使用Qt Designer来解决一些基础问题。

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

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

注意 - 我遵循这个简单的教程:http://www.youtube.com/watch?v=bHsC6WJsK-U&list=PLF4575388795F2531&index=10&feature=plpp_video

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

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

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

我希望在没有添加一堆不相关的代码的情况下这是明确的......

1 个答案:

答案 0 :(得分:4)

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

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

testwidget.py

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())

testwindow.py

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)

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

我可以在TestWidget的emitTextSaved方法中做self.parent()。showMessage(self .__ edit.toPlainText())来直接调用方法 - 但这不是一个好的设计。