25

このコードを実行すると:

    #!/usr/local/bin/    python3

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


class Window(QMainWindow):

    def __init__(self):
        super().__init__()
        self.button1 = QPushButton("1")
        self.button2 = QPushButton("2")
        self.setCentralWidget(self.button1)
        self.button1.clicked.connect(lambda: self.setCentralWidget(self.button2))
        self.button2.clicked.connect(lambda: self.setCentralWidget(self.button1))
        self.show()

if __name__ == '__main__':

    import sys 
    app = QApplication(sys.argv)
    window = Window()
    sys.exit(app.exec_())

...次の出力が得られます。

Traceback (most recent call last):
  File "test.py", line 16, in <lambda>
    self.button2.clicked.connect(lambda: self.setCentralWidget(self.button1))
RuntimeError: wrapped C/C++ object of type QPushButton has been deleted

オブジェクトが削除される理由がわかりません。ウィンドウはそれへの参照を維持する必要があります。これらの投稿を徹底的に調査しました: 「基礎となる C/C++ オブジェクトが削除されました」エラーを理解 する

ボタンが削除されるのはなぜですか?

4

4 に答える 4

21

この質問に対するこの回答は、次の場所にあります: Python PySide (Internal c++ Object Alreaded Deleted)

どうやら、setCentralWidget を使用して 1 つのウィジェットを QMainWindow に割り当て、次に setCentralWidget を使用して別のウィジェットを割り当てると、参照を維持するオブジェクトがある場合でも、基になる c++ QWidget が削除されます。

注: QMainWindow はウィジェット ポインターの所有権を取得し、適切なタイミングで削除します。

于 2013-07-29T23:05:17.040 に答える
1

この問題は、連続スレッドを実行し、最初にスレッドを閉じずにメインウィンドウ/ダイアログを閉じるが、バックグラウンドでスレッドが処理されている場合にも、PyQT5 で発生します。ウィンドウを再度開くと、2 番目のスレッドが生成され、既存のウィジェットが削除されます。スレッドを再実行する前に、まずスレッドを終了する必要があります。メインウィンドウ/ダイアログのウィジェットの可視性にチェックを入れることで、スレッドを終了できます

            **if self.widget.isVisible() == False:
                break**
于 2020-03-16T05:11:54.667 に答える