2017-12-05 30 views
1

私はQTを初めて使い、PythonでプログラミングするためにQT 5を使っています。私はメインウィンドウを持っていますが、2番目のウィンドウのボタンをクリックしようとすると、表示されますがすぐに消えます。誰も私はこの問題を解決する方法を知っていますか?QTが消える第2のウィンドウ

def SecondWindow(): 
    qw = QWidget() 
    qw.resize(800, 800) 
    qw.move(300, 300) 
    qw.show() 
+0

を表示[MCVE] .. – eyllanesc

+3

変更 '' self.qw'にqw':ガベージコレクタ – eyllanesc

+0

と 'デフ'SecondWindow()'と 'SecondWindow()'から 'self.SecondWindow()' – eyllanesc

答えて

2

PythonはC++とは異なります。後者では、ウィジェットをリークしても、コードは必要に応じて機能します。技術的には、QApplication::topLevelWidgetsからアクセスできるので、ウィジェットは漏れません。

SecondWindow終了後のqwへの参照はありません。これはローカル変数です。したがって、ウィジェットはすぐに破棄されます。なぜなら、Pythonは最初にオブジェクトのライフタイム管理の参照カウントを使用します。ガベージコレクタはサイクルを形成するオブジェクトを収集するためだけであり、ここではそうではありません。

ソリューションは、あなたが作成したウィジェットへの参照を維持することです:

class MyClass(QObject): 
    @pyqtSlot() 
    def second_windowClick(self): 
    self.SecondWindow() 

    def SecondWindow(self): 
    qw = QWidget() 
    qw.resize(800, 800) 
    qw.move(300, 300) 
    qw.show() 
    self.qw = qw 
+0

ありがとうございます。しかし、私が受け取る:second_windowClick self.SecondWindow() はAttributeErrorで ファイル "app.py"、40行、 'ブール' オブジェクトが何の属性を持っていない 'をSecondWindow' 中止トラップ:どちらの関数は上記されている6 –

+0

@DerrickJonesをメソッド。彼らはクラスに属しています!私はそれを明示した。 –

関連する問題