Я создаю приложение, которое автоматизирует загрузку веб-страниц и создание скриншотов (нет, я не могу использовать одно из существующих решений), используя PySide.Одна часть приложения получает список URL-адресов и загружает каждый URL-адрес по очереди, используя объект new QWebPage.После загрузки страницы делается снимок экрана и объект QWebPage удаляется.
Время от времени, при достаточном количестве прогонов, я получаю следующую ошибку из PySide в качестве исключения RuntimeError:
Invalid Signal signature: loadStarted()
Failed to connect signal loadStarted().
Первая строка печатается в STDERR (возможно, Qt?)и вторая строка - исключение Python.
loadStarted () - это встроенный сигнал QWebPage, а не то, что я создал.Это работает в 90% случаев, и я не мог понять, почему он иногда терпит неудачу.
Если честно, это приложение довольно необычно по дизайну, так как оно подключает PySide / Qt к веб-приложению, обслуживаемому uWSGI - это означает, что, например, я не использую цикл событий QApplication, а скорее локальный цикл событийдля каждой загрузки страницы.Я также не опытен ни в Qt, ни в Python, поэтому возможно, что я делаю много ошибок, но я не могу понять, что это такое.
Я думаю, этот пост может иметь к этому какое-то отношение, но я не уверен.
Есть предложения о том, где искать дальше?
ОБНОВЛЕНИЕ: сигнал связан с помощью следующего кода:
class MyWebPage(QWebPage):
def __init__(self, parent=None):
super(MyWebPage, self).__init__(parent)
self.loadStarted.connect(self.started)
self.loadFinished[bool].connect(self.finished)
Объекты MyWebPage создаются как дочерние элементы другого отдельного экземпляра QObject, который не удаляется до тех пор, покапроцесс останавливается.Они удаляются путем вызова page.deleteLater (), как только я закончу с ними.Поскольку я запускаю локальный цикл обработки событий, я запускаю отложенные удаления после выхода из локального цикла обработки событий, вызывая:
# self.eventLoop is the local event loop, which at this stage is not running
self.eventLoop.processEvents()
# self.app is the QApplication instance
self.app.sendPostedEvents(None, QEvent.DeferredDelete)