我正在使用PySide创建一个应用程序,它可以自动加载网页并创建屏幕截图(不,我不能使用现有解决方案之一)。应用程序的一部分获取URL列表,并使用新的 QWebPage对象依次加载每个URL。加载页面后,将截取截图并删除QWebPage对象。在PySide中出现不稳定的“无效信号签名”错误QWebPage
然后每一个现在,只要有足够的运行,我从PySide下面的错误,如抛出一个RuntimeError例外:
Invalid Signal signature: loadStarted()
Failed to connect signal loadStarted().
第一行打印到STDERR(可能是通过Qt的?),第二行是Python异常。
loadStarted()是一个内置的QWebPage信号,而不是我创建的东西。这在90%的时间内工作,我无法弄清楚偶尔会有什么故障。老实说,这个应用程序在设计上非常不寻常,因为它将PySide/Qt挂钩到一个uWSGI服务的web应用程序中 - 这意味着例如我不使用QApplication事件循环,而是使用本地事件循环页面加载。我也没有Qt或Python的经验,所以我可能犯了很多错误,但我无法弄清楚这些是什么。
我在想this后可能与它有关系,但我不确定。
关于下一步看什么的建议?
UPDATE:信号通过下面的代码连接:
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)
信号如何连接?你使用什么代码来确保网页对象被正确删除?你是否试图创建一个简化的测试用例来重现问题? – ekhumoro
我试着创建一个简化的测试用例,但到目前为止不能 - 这是很难重现的。我用一些可能有所帮助的信息更新了这个问题。 – shevron
你碰巧有任何多线程正在进行吗? – Luke