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

时间:2015-09-27 05:59:18

标签: python c++ pyqt pyqt4

我将举两个例子来解释它

我创建了一个Button,当我点击它时,它会在TextEdit Widget中显示一条消息(在这种情况下,它显示“A string”)。

如果我在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

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

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

谢谢,对不起我的英文

1 个答案:

答案 0 :(得分:0)

这是因为您在函数范围内创建了一个新的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_()