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

2024-04-29 08:26:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我先从这个问题开始,然后试着解释: 导入的模块是否可以调用导入它的模块中的函数?

我只是在学习使用Qt,并开始与Qt设计师,以得到一些基本的工作。

我已经找到了如何创建多个“.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的任何更改都将破坏我更改的代码。

因此,导入的模块是否可以调用导入它的模块中的函数?

我希望这是清楚的,而不是添加一堆不太相关的代码。。。


Tags: 模块文件函数代码py应用程序ui链接
1条回答
网友
1楼 · 发布于 2024-04-29 08:26:24

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

测试窗口.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的show message槽。这样,你的小部件变得更加独立,它更多的是你如何连接到驱动你的应用程序的每个事件。

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

相关问题 更多 >