Я хотел бы сделать некоторые операции очистки внутри объекта непосредственно перед его уничтожением. В этом случае будет закрыто соединение с базой данных.Как вызвать функцию, когда объект 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)
И функция, вызвать работника из другого класса:
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()
Вот что я уже опробован:
- Define a
__del__
function в классе Worker эта функция никогда не вызывается. - Определите функцию в классе «Рабочий», а затем подключите ее к уничтоженному сигналу с помощью
self.destroyed.connect(self.function)
. Эта функция снова не вызывается. Я думаю, это происходит потому, что сигнал излучается, когда объект уже уничтожен, а не до его уничтожения.
Я действительно интересно, о том, как это, вот некоторые части ответа:
http://www.riverbankcomputing.com/pipermail/pyqt/2014-November/035049.html
Его подход кажется немного Hacky ко мне (не в обиду автору, то, вероятно, нет простого ответа), и у меня есть сигналы & Параметры, которые нужно передать рабочему колдуну, сделают класс ThreadController messier.
Я считаю это решение немного Hacky, потому что вы должны создать класс контроллера, чтобы сделать классовую работу на
Если никто не имеет ответа, я, вероятно, использовать класс ThreadController и отправить результат здесь.
спасибо за чтение :-)
Ответ на вопрос в заголовке, чтобы подключиться к [ 'QObject.destroyed'] (http://doc.qt.io/qt-5/qobject.html #destroyed) сигнал. Я не понимаю, почему вы считаете это решение «взломанным». Не могли бы вы уточнить? –
отредактировал мой вопрос, теперь должно быть ясно – icefo
Хмм, вы пытались подключить разрушенный сигнал к слоту в самой нити или к одному в основном потоке? –