簡體   English   中英

PyQt4在類之間連接信號

[英]PyQt4 connect signals between classes

我是使用pyQt進行GUI編程的新手。 我用按鈕設置了一個簡單的gui,單擊該按鈕將執行來自單獨類的方法。 但是,當我單擊按鈕時,出現以下錯誤:

*處理收到的信號 信號:分段錯誤(11)信號代碼:未映射地址(1)在地址失敗:(nil)[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元素與應執行的方法連接的正確方法是什么?

我無法在您的系統上用您的代碼重現該段錯誤,但這一定是因為您沒有保留對本應存在的對象的引用,直到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_())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM