PYQT 4:如何在另一个 class 中调用 GUI 函数?

PYQT 4: How can i call a GUI Function in another class?

我会举2个例子来说明

我创建了一个按钮,当我单击它时,它会在 TextEdit 小部件中显示一条消息(在本例中显示 "A string")。

如果我在同一个 class GUI 中这样做,我没有问题:

from PyQt4.QtGui import *
import sys


class Aplicacion(QWidget):
    def __init__(self, parent=None):
        super(Aplicacion, self).__init__()

        vbox = QVBoxLayout(self)

        self.textedit = QTextEdit('')
        self.button = QPushButton("Do anything")

        #Layouts
        vbox.addWidget(self.textedit)
        vbox.addWidget(self.button)


        #Connections
        self.button.clicked.connect(self.aFunction)

    def aFunction(self):
        self.textedit.append("A string")

app = QApplication(sys.argv)
test = Aplicacion()
test.show()
app.exec_()

工作正常:http://puu.sh/kpEHC.png

但是当我试图在另一个 class 或函数中做同样的事情时,我得到了这个错误:

from PyQt4.QtGui import *
import sys

def appendAnything(self):
    Aplicacion().textedit.append("test")  # HERE IS THE ERROR




class Aplicacion(QWidget):
    def __init__(self, parent=None):
        super(Aplicacion, self).__init__()

        vbox = QVBoxLayout(self)

        self.textedit = QTextEdit('')
        self.button = QPushButton("Do anything")

        #Layouts
        vbox.addWidget(self.textedit)
        vbox.addWidget(self.button)


        #Connections
        self.button.clicked.connect(appendAnything)

    def aFunction(self):
        self.textedit.append("A string")

app = QApplication(sys.argv)
test = Aplicacion()
test.show()
app.exec_()

错误:

Aplicacion().textedit.append("test")  # HERE IS THE ERROR
RuntimeError: wrapped C/C++ object of type QTextEdit has been deleted

图片:http://puu.sh/kpETO.png

谢谢,对不起我的英语

发生这种情况是因为您正在函数范围内创建一个新的 Aplicacion 实例,并且一旦您的代码返回主循环它就会被销毁,因为您没有保留这个新实例的任何引用.另外我不明白你为什么要创建一个新的 Aplicacion 实例:我认为你应该将你的主小部件的引用传递给函数。一种简单的(非线程安全的)方法是使用 partial:

from PyQt4.QtGui import *
from functools import partial 
import sys

def appendAnything(self, app):
    app.textedit.append("test")

class Aplicacion(QWidget):
    def __init__(self, parent=None):
        super(Aplicacion, self).__init__()

        vbox = QVBoxLayout(self)

        self.textedit = QTextEdit('')
        self.button = QPushButton("Do anything")

        #Layouts
        vbox.addWidget(self.textedit)
        vbox.addWidget(self.button)

        #Connections
        self.button.clicked.connect(partial(appendAnything, app=self))

    def aFunction(self):
        self.textedit.append("A string")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    test = Aplicacion()
    test.show()
    app.exec_()