我将从问题开始,然后尝试解释:
导入的模块是否可以在导入该模块的模块中调用函数?
我只是在学习使用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的任何更改都会破坏我更改过的代码.
因此,导入的模块是否可以在导入该模块的模块中调用函数?
我希望这很清楚,而不必添加一堆真正不相关的代码…
解决方法:
Qt基于事件驱动的编程.通常,当您开始构建窗口小部件时,您要做的就是通过随后经过处理的信号向接收器窗口小部件提供信息.您不想显式地知道子窗口小部件,也不希望在父窗口小部件上调用方法(这种情况并非总是如此,但是最好避免).
我将在这里发布一些没有UI文件的示例,但是假设您可以使用Designer构建相同的小部件并以相同的方式工作…
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())之类的操作,以直接调用该方法-但这不是一个好的设计.