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

How to call a function when a QObject is about to be destroyed?

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

这是我已经在做的事情:

工人class:

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 的函数 class :

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()

这是我已经尝试过的:

我真的很想知道如何做到这一点,这里是部分答案:

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

他的方法对我来说似乎有点老套(没有冒犯作者,可能没有简单的答案)并且我有信号和参数传递给工作人员 将使 ThreadController class混乱。

我觉得这个解决方案有点老套,因为你必须设置一个控制器 class 来完成 Worker class 工作

如果没有人有答案,我可能会在这里使用 ThreadController class 和 post 结果。

感谢您的阅读:-)

python 中的常用规则适用:

there is a module for that

解决方法是使用atexit模块,在__init__函数中注册cleanup函数

示例:

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)