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应用程序,它加载到运行各种对话框的文件中,并使其保持动态,其中一个子对话框中定义的所有内容都需要保留在其中。我不想关闭在父级中的子级中打开的连接,因为这违背了我设置的目的。谢谢你。