1

カスタムQDialogクラスを作成し、をオーバーライドしcloseEventて、ダイアログが別のウィジェットの子であるため、ダイアログを非表示にしました。私のダイアログは、親が閉じられたときにのみ閉じる必要があり、受け入れられたとき、拒否されたとき、またはユーザーが閉じるボタンをクリックしたときではありません。

これはすべて正常に機能しますが、データベースへの接続を開き、ダイアログが閉じられたときだけでなく、ダイアログが破棄されたときにのみ閉じる必要があります。

私のコード:

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

def Log_Closed():
    print "Bye bye"

class My_dlg(QDialog):
    def __init__(self, parent=None):
        QDialog.__init__( self, parent )

        #self.conn = open_connection()
        print "Connection Opened"

        close_btn  = QPushButton("Actually Close")
        QVBoxLayout(self).addWidget(close_btn)

        close_btn.clicked.connect(self.Actually_Close)
        self.destroyed.connect(Log_Closed)

    def Actually_Close(self):
        print "Actually Close"
        self.parent().close()

    def closeEvent(self, event):
        if event.type() == QEvent.Close:
            event.ignore()
            self.hide()
            print "hidden"

    # And I guess I need something like
    def destroyEvent(self, event):
        #self.conn.close()
        print "Connection Closed"
        event.accept()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main= QMainWindow()
    tsd = My_dlg(main)
    tsd.show()
    sys.exit(app.exec_())

何か案は?

4

1 に答える 1

8

QObjectaが削除されたときに通知を受け取るには、そのdestroyed(QObject*)シグナルに接続します。

ただし、Pythonでは、オブジェクトはガベージコレクションされるため、C++よりもオブジェクトの削除の予測が難しくなります。たとえば__del__()Pythonのドキュメントに関連するすべての警告を参照してください。プログラムの終了時に削除されない場合があります。これが、シグナルを受信して​​いない理由である可能性があります。

ダイアログの削除に依存する代わりに、データベース接続を明示的に管理できます。この単純な例では、コンテキストマネージャーを使用して少し優れたコードを作成することもできます。


いずれにせよ、期待どおりに動作するコードのバージョンは次のとおりです:https ://gist.github.com/3827718

私が行った変更は次のとおりです。

  • app.setQuitOnLastWindowClosedダイアログが閉じたときにアプリケーションが終了しないように設定します。そうでなければこの質問は意味をなさないので、私はこれがあなたが望む振る舞いであると思います。

  • ダイアログをオンに設定Qt.WA_DeleteOnCloseするFalseと、閉じたときにダイアログが削除されないようになります。これは、オーバーライドするよりも望ましい方法closeEventです。

  • Actually_Close()で、ダイアログはそれ自体を削除します(これによりダイアログも閉じられます)。これにより信号がトリガーされdestroyedます。

このコードを使用すると、ボタンをクリックしたときに期待どおりの出力が得られます。

Connection Opened
Actually Close
Bye bye
于 2012-10-02T15:34:00.820 に答える