Python PyQT:如何从外部函数访问MainWindow窗口小部件?

Python PyQT:如何从外部函数访问MainWindow窗口小部件?,python,function,user-interface,pyqt,Python,Function,User Interface,Pyqt,例如,单击主窗口中的按钮调用test()函数向主窗口中的文本编辑框添加一些文本 #!/usr/bin/python # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'felch1.ui' # # Created: Fri Aug 15 15:19:31 2014 # by: PyQt4 UI code generator 4.10.4 # # WARNING! All chang

例如,单击主窗口中的按钮调用test()函数向主窗口中的文本编辑框添加一些文本

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'felch1.ui'
#
# Created: Fri Aug 15 15:19:31 2014
#      by: PyQt4 UI code generator 4.10.4
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

def test():
    MainWindow.textEdit.append('button pushed')


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(800, 600)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(30, 20, 131, 31))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.textEdit = QtGui.QTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QtCore.QRect(30, 80, 341, 441))
        self.textEdit.setObjectName(_fromUtf8("textEdit"))
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 25))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), test)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.pushButton.setText(_translate("MainWindow", "test", None))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

我知道我不应该处理生成的文件,只是想弄清楚如何从该类之外的函数引用主窗口对象。

我认为最简单的方法是将
test
作为
Ui\u MainWindow
的一个实例方法,并将
MainWindow
对象保存为
Ui\u MainWindow
的实例变量

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(800, 600)
        self.main_window = MainWindow

        # blah blah

        self.textEdit = QtGui.QTextEdit(self)
        self.pushButton = QtGui.QPushButton(self)
        self.pushButton.clicked.connect(self.test)

    def test(self):
        self.main_window.textEdit.append('button pushed')
如果您确实希望
test
成为顶级函数,则还可以使用在执行
test
回调时传递
main窗口
对象:

from functools import partial

def test(MainWindow):
    MainWindow.textEdit.append('button pushed')


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(800, 600)

        # blah blah

        self.textEdit = QtGui.QTextEdit(self)
        self.pushButton = QtGui.QPushButton(self)
        test_func = partial(test, MainWindow)  # Calling test_func(arg) actually calls test(MainWindow, arg)
        self.pushButton.clicked.connect(test_func)

可能的方法是传递对象
QtGui.QMainWindow
要执行所需的方法,请使用
partial
传递所需的参数,将主窗口对象传递到
test()

    from PyQt4 import QtCore, QtGui
    from functools import partial
        .
        .
        .
    def test(MainWindow):
        MainWindow.textEdit.append('button pushed')

    def setupUi(self, MainWindow):
        .
        .
        .
        MainWindow.textEdit = QtGui.QTextEdit(self.centralwidget) # Pass to QMainWindows not self
        MainWindow.textEdit.setGeometry(QtCore.QRect(30, 80, 341, 441))
        MainWindow.textEdit.setObjectName(_fromUtf8("textEdit"))
        MainWindow.setCentralWidget(self.centralwidget)
        .
        .
        .
        self.retranslateUi(MainWindow)
        QtCore.QObject.connect(MainWindow.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), partial(test, MainWindow))
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        .
        .
        .


关于,请提供更多信息,什么是主窗口?(是QWidget还是QMainWindows?)、代码等。谢谢。我已经编辑了这个问题以包含整个示例。谢谢!使用部分作品,万岁!几个小时来一直在激怒我。:)必须将QtCore.QObject.connect(MainWindow.butdown,QtCore.SIGNAL(_fromUtf8(“clicked()”),partial(test,MainWindow))更改为QtCore.QObject.connect(self.butdown,QtCore.SIGNAL(_fromUtf8(“clicked()”),partial(test,self)),但现在可以工作了,谢谢!