2017-10-23 18 views
1

panel.pyクラスのbuttonAを参照するクラスにはシグナルを送ることができません しかし、panel2.pyの参照ボタンでは、クラスAを達成することができます パネルでbuttonAクラスの使用を繰り返す場合。 pyクラス、そのような問題に対処する方法。だけbtnA1一度python pyqt5クラス参照

buttonA.py

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

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

    def createButton(self): 
     self.btnA1 = QPushButton("btnA1", self) 
     self.btnA1.pressed.connect(self.onbtnA1Pressed) 
     self.btnA1.released.connect(self.onbtnA1Released) 
     vbox = QVBoxLayout() 
     vbox.addWidget(self.btnA1) 
     return vbox 

    def onbtnA1Pressed(self): 
     self.btnA1.setText("btnA1 clicked") 

    def onbtnA1Released(self): 
     self.btnA1.setText("btnA1") 

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): 
     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_()) 

panel2.py

#!/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_()) 

答えて

2

panel.pyで、中にあなたのcreatePanelを発生することがありますbuttonAクラスを継承するようにしてください関数を使用する必要があります。この場合は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_()) 
+1

これはのOPコードを修正しますが、それは本当に理由を説明しません。問題は、* panel.py *において、 'ButtonA'クラスがシグナルを**自分の**スロットに接続することです。しかし、 'createPanel'メソッドは、' ButtonA'のインスタンスをガベージコレクトすることができ、自動的にそれらのスロットを切断します。 * panel2.py *では、 'ButtonA'のインスタンスはグローバル変数なので、スクリプトが終了するまでガベージコレクションされません。 – ekhumoro

+0

大変ありがとうございます。 –