python pyqt5类引用

python pyqt5类引用,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,panel.py类中引用buttonA的类无法发出信号 但是在panel2.py参考buttonA类中可以实现 如果要在panel.py类中重复使用buttonA类,请说明如何处理此类问题。尝试继承buttonA类只能发生一次btnA1 钮扣 panel.py 面板2.py 在panel.py中,在createPanel函数中,在声明实例变量时,必须使用实例,在本例中为self 这应该起作用: panel.py #!/usr/bin/env python from PyQt5.QtWidgets

panel.py类中引用buttonA的类无法发出信号 但是在panel2.py参考buttonA类中可以实现 如果要在panel.py类中重复使用buttonA类,请说明如何处理此类问题。尝试继承buttonA类只能发生一次btnA1

钮扣 panel.py 面板2.py
panel.py
中,在
createPanel
函数中,在声明实例变量时,必须使用实例,在本例中为
self

这应该起作用:

panel.py

#!/usr/bin/env python
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QApplication
import sys, buttonA

class Panel(QWidget):
    def __init__(self):
        super().__init__()

    def createPanel(self):
        self.a1 = buttonA.ButtonA()
        self.a2 = buttonA.ButtonA()
        self.v1 = self.a1.createButton()
        self.v2 = self.a2.createButton()

        vbox = QVBoxLayout()
        vbox.addLayout(self.v1)
        vbox.addLayout(self.v2)
        self.setLayout(vbox)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    p = Panel()
    p.createPanel()
    p.show()
    sys.exit(app.exec_())

虽然这将修复OPs代码,但并不能真正解释原因。问题在于,在panel.py中,
ButtonA
类将信号连接到自己的插槽。但是
createPanel
方法允许垃圾收集
ButtonA
的实例,然后会自动断开这些插槽。在panel2.py中,
ButtonA
的实例是全局变量,因此它们在脚本退出之前不会被垃圾收集。非常感谢您的精彩解释。
#!/usr/bin/env python
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QApplication
import sys, buttonA

class Panel(QWidget):
    def __init__(self):
        super().__init__()

    def createPanel(self):
        a1 = buttonA.ButtonA()
        a2 = buttonA.ButtonA()
        v1 = a1.createButton()
        v2 = a2.createButton()

        vbox = QVBoxLayout()
        vbox.addLayout(v1)
        vbox.addLayout(v2)
        self.setLayout(vbox)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    p = Panel()
    p.createPanel()
    p.show()
    sys.exit(app.exec_())
#!/usr/bin/env python
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout
import buttonA, sys

app = QApplication(sys.argv)
w = QWidget()

a1 = buttonA.ButtonA()
a2 = buttonA.ButtonA()
v1 = a1.createButton()
v2 = a2.createButton()

vbox = QVBoxLayout()
vbox.addLayout(v1)
vbox.addLayout(v2)
w.setLayout(vbox)
w.show()

sys.exit(app.exec_())
#!/usr/bin/env python
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QApplication
import sys, buttonA

class Panel(QWidget):
    def __init__(self):
        super().__init__()

    def createPanel(self):
        self.a1 = buttonA.ButtonA()
        self.a2 = buttonA.ButtonA()
        self.v1 = self.a1.createButton()
        self.v2 = self.a2.createButton()

        vbox = QVBoxLayout()
        vbox.addLayout(self.v1)
        vbox.addLayout(self.v2)
        self.setLayout(vbox)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    p = Panel()
    p.createPanel()
    p.show()
    sys.exit(app.exec_())