Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当QWidget被实际销毁时执行代码,而不仅仅是关闭_Python_Qt_Pyqt_Destroy - Fatal编程技术网

Python 当QWidget被实际销毁时执行代码,而不仅仅是关闭

Python 当QWidget被实际销毁时执行代码,而不仅仅是关闭,python,qt,pyqt,destroy,Python,Qt,Pyqt,Destroy,我已经创建了一个自定义的QDialog类,并覆盖了closeEvent来隐藏对话框,因为它是另一个小部件的子项。“我的对话框”只能在其父对话框关闭时关闭,而不能在接受、拒绝或用户单击“关闭”按钮时关闭 这一切都很好,但现在我需要打开一个到数据库的连接,并且只在对话框被破坏时关闭它,而不仅仅是在对话框关闭时 我的代码: from PyQt4.QtCore import * from PyQt4.QtGui import * import sys def Log_Closed(): pri

我已经创建了一个自定义的
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_())

有什么想法吗?

要在删除
QObject
时收到通知,请连接到其信号

< P>但是,在Python中,对象删除比C++更难预测,因为对象是垃圾收集的。例如,请参阅中与
\uu del\uuu()
相关的所有注意事项。当程序退出时,它们可能不会被删除,这可能就是您没有收到信号的原因

您可以显式地管理数据库连接,而不是依赖于删除对话框。在这个简单的例子中,您甚至可以使用一个更简单的代码


无论哪种方式,这里都有一个版本的代码,其行为与您预期的一样:

我所做的改变是:

  • 设置
    app.setQuitOnLastWindowClosed
    以确保对话框关闭时应用程序不会退出。我想这是你想要的行为,因为否则这个问题就没有意义了

  • 将对话框上的
    Qt.WA_DeleteOnClose
    设置为
    False
    ,以防止其在关闭时删除自身。这比重写
    closeEvent
    更可取

  • 实际\u Close()
    中,对话框将删除自身(这也将关闭它)。这将触发
    已销毁的
    信号

使用此代码,当您单击按钮时,输出与预期一致:

Connection Opened
Actually Close
Bye bye

要在删除
QObject
时接收通知,请连接到其信号

< P>但是,在Python中,对象删除比C++更难预测,因为对象是垃圾收集的。例如,请参阅中与
\uu del\uuu()
相关的所有注意事项。当程序退出时,它们可能不会被删除,这可能就是您没有收到信号的原因

您可以显式地管理数据库连接,而不是依赖于删除对话框。在这个简单的例子中,您甚至可以使用一个更简单的代码


无论哪种方式,这里都有一个版本的代码,其行为与您预期的一样:

我所做的改变是:

  • 设置
    app.setQuitOnLastWindowClosed
    以确保对话框关闭时应用程序不会退出。我想这是你想要的行为,因为否则这个问题就没有意义了

  • 将对话框上的
    Qt.WA_DeleteOnClose
    设置为
    False
    ,以防止其在关闭时删除自身。这比重写
    closeEvent
    更可取

  • 实际\u Close()
    中,对话框将删除自身(这也将关闭它)。这将触发
    已销毁的
    信号

使用此代码,当您单击按钮时,输出与预期一致:

Connection Opened
Actually Close
Bye bye

谢谢你的回复。起初我也这么想,但我试过了,但似乎什么都没做,所以我觉得我做错了什么。无论如何,我已经更新了我的代码,以包括被破坏的连接,但与以前一样,它似乎不起作用。你知道我做错了什么吗?对不起,我没有仔细阅读你的例子。因为Python使用垃圾收集,对象生命周期比C++中的行为更微妙。特别是,Python不能保证在程序退出时删除对象,所以我怀疑这就是这里发生的事情。我想澄清一下。谢谢你的回复。起初我也这么想,但我试过了,但似乎什么都没做,所以我觉得我做错了什么。无论如何,我已经更新了我的代码,以包括被破坏的连接,但与以前一样,它似乎不起作用。你知道我做错了什么吗?对不起,我没有仔细阅读你的例子。因为Python使用垃圾收集,对象生命周期比C++中的行为更微妙。特别是,Python不能保证在程序退出时删除对象,所以我怀疑这就是这里发生的事情。我想澄清一下。如果对话框只有在其父级关闭时才应该关闭,为什么不使用父级的
closeEvent
来执行必要的清理操作呢?我已经创建了一个小型python应用程序,它加载运行各种对话框的文件,并保持动态,在其中一个子对话框中定义的所有内容都需要留在其中。我不想关闭在父级中的子级中打开的连接,因为这违背了我设置的目的。不过,谢谢。如果对话框应该只在其父对话框关闭时关闭,为什么不使用父对话框的
closeEvent
来执行必要的清理操作呢?我创建了一个小型python应用程序,它加载到运行各种对话框的文件中,并使其保持动态,其中一个子对话框中定义的所有内容都需要保留在其中。我不想关闭在父级中的子级中打开的连接,因为这违背了我设置的目的。谢谢你。