gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:22:58 32 4
gpt4 key购买 nike

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

我刚刚开始学习使用 Qt,并开始使用 Qt Designer 来了解一些基础知识。

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

例如,从 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 文件的示例,但假设您可以使用设计器构建相同的小部件并使其以相同的方式工作...

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()) 的操作来直接调用该方法 - 但这不是一个好的设计。

关于python - PyQt Multiple Windows - 如何在模块之间传递函数 Qt Designer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12061251/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com