如何在QObject即将被销毁时调用函数?

时间:2015-08-06 00:58:17

标签: python destructor pyqt5 qobject

我想在对象破坏之前做一些清理操作。在这种情况下,它将关闭与数据库的连接。

以下是我一直在做的事情:

工人阶级:

from PyQt5 import QtCore
from pymongo import MongoClient, ASCENDING
from time import sleep

class StatusWidgetWorker(QtCore.QObject):

    ongoing_conversions_transmit = QtCore.pyqtSignal([list])

    def __init__(self, mongo_settings):
        super().__init__()
        print("StatusWidget Worker init")
        mongo_client = MongoClient([mongo_settings["server_address"]])
        self.log_database = mongo_client[mongo_settings["database"]]
        self.ongoing_conversions = mongo_settings["ongoing_conversions"]

    def status_retriever(self):
        print("mongo bridge()")
        while True:
            ongoing_conversions_list = []
            for doc in self.log_database[self.ongoing_conversions].find({}, {'_id': False}).sort([("start_date", ASCENDING)]):
                ongoing_conversions_list.append(doc)
            self.ongoing_conversions_transmit.emit(ongoing_conversions_list)
            sleep(2)

从另一个类调用worker的函数:

def status_worker(self):
    mongo_settings = "dict parameter"

    self.worker_thread_status = QtCore.QThread()
    self.worker_object_status = StatusWidgetWorker(mongo_settings)
    self.worker_object_status.moveToThread(self.worker_thread_status)

    self.worker_thread_status.started.connect(self.worker_object_status.status_retriever)
    self.worker_object_status.ongoing_conversions_transmit.connect(self.status_table_auto_updater)

    self.worker_thread_status.start()

这是我已经尝试过的:

    在Worker类中
  • Define a __del__ function,永远不会调用此函数。
  • 在Worker类中定义一个函数,然后使用self.destroyed.connect(self.function)将其连接到已销毁的信号。永远不会调用此函数。我认为这是因为当对象已被破坏时,而不是在破坏之前发出信号。

我真的很想知道如何做到这一点,这里有一些答案:

http://www.riverbankcomputing.com/pipermail/pyqt/2014-November/035049.html

他的做法对我来说似乎有些苛刻(对作者没有冒犯,可能没有简单的答案)而且我有信号&传递给worker的参数会使ThreadController类变得更加混乱。

我觉得这个解决方案有点hacky因为你必须设置一个Controller类来完成Worker类的工作

如果没有人有答案,我可能会使用ThreadController类并在此处发布结果。

感谢您阅读: - )

1 个答案:

答案 0 :(得分:0)

python中的通常规则适用:

  

有一个模块

解决方案是使用atexit模块并在__init__函数中注册清理函数。

示例:

import atexit

class StatusWidgetWorker(QObject):

    def __init__(self):
        super().__init__()
        # code here
        atexit.register(self.cleanup)

    def cleanup(self):
        print("Doing some long cleanup")
        sleep(2)
        self.bla = "Done !"
        print(self.bla)