PyQt4连接类

时间:2016-07-20 17:58:26

标签: python user-interface pyqt4

我是使用pyQt进行gui编程的新手。 我已经设置了一个带有按钮的简单gui,该按钮在单击时将从单独的类执行方法。但是当我点击按钮时出现以下错误:

*处理收到的信号 信号:分段故障(11) 信号代码:未映射的地址(1) 地址失败:(无) [0] /lib/x86_64-linux-gnu/libpthread.so.0(+0x113d0)[0x7fc1957ff3d0] 错误消息结束*

这是我的代码:

from PyQt4.QtCore import *
from PyQt4 import QtGui, uic

class MyWindow(QtGui.QDialog):
    def __init__(self):
        super(MyWindow, self).__init__()   
        self.ui = uic.loadUi('gui.ui', self)
        self.ui.show()

class A(QObject):
    def __init__(self):
        super(A, self).__init__()

       @pyqtSlot()            
       def funcA(self):

class Main(QtGui.QDialog):
    def __init__(self, parent=None):
        gui = MyWindow()
        H = A()
        gui.connect(gui.button, SIGNAL("clicked()"), H.funcA) 

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    Main()   
    sys.exit(app.exec_())

将GUI元素与应执行的方法连接起来的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我无法在我的系统上使用您的代码重现段错误,但必须是因为您不是 保持对应该存在的对象的引用,直到Qt应用程序结束。

Main.__init__中,您将新创建的MyWindowA分配给本地变量。这些对象将被垃圾收集器破坏 在__init__退出之后,信号将连接到不存在的对象的插槽,这将导致各种令人讨厌的事情,包括段错误。

要解决此问题,您有两种选择:

(选项1)将这些对象保存为Main的属性:

    self.gui = MyWindow()
    self.H  = A()

(Option2)通过在构造函数的父参数中传递self,将它们插入到Qt的对象树中

    gui = MyWindow(self)

以下是适用于我的代码:

from PyQt4.QtCore import *
from PyQt4 import QtGui
import sys

class MyWindow(QtGui.QDialog):
    # (Option2) Notice that the added `parent` argument is passed to super().__init__
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)
        layout = QtGui.QVBoxLayout(self)
        self.button = QtGui.QPushButton(self)
        layout.addWidget(self.button)
        self.show()

class A(QObject):
    def __init__(self):
        super(A, self).__init__()

    @pyqtSlot()            
    def funcA(self):
       print 'funcA'

class Main(QtGui.QDialog):
    def __init__(self, parent=None):
        super(Main, self).__init__()

        # (Option1)
        self.H = A()

        # (Option2)
        gui = MyWindow(self)

        gui.button.clicked.connect(self.H.funcA)
        # gui.connect(gui.button, SIGNAL("clicked()"), self.H.funcA) 

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    # the Main object must be saved from the garbage collector too
    main_dlg = Main()   
    sys.exit(app.exec_())