在PySide QWebPage中获得不稳定的“无效信号签名”错误

时间:2012-01-16 13:59:01

标签: python qt4 pyqt4 pyside qwebpage

我正在创建一个应用程序,它可以自动加载网页并使用PySide创建屏幕截图(不,我不能使用现有的解决方案之一)。应用程序的一部分获取URL列表,并使用 QWebPage对象依次加载每个URL。加载页面后,将截取屏幕截图并删除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帖子可能与它有关,但我不确定。

关于下一步要去哪里的建议?

更新:信号通过以下代码连接:

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)

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题(我偶尔会遇到这些错误,但我不能一直重现它)。我认为你可能是正确的,当你尝试将信号连接到它们时,它与不存在的方法有关 - 只是为了测试它,我把.connect调用放在一个单独的方法中,错误就消失了。例如:

修改  (几个小时后)我想我说的太快了 - 我再次收到了错误。

<强>更新  (几个星期后)

我经常使用语法,偶尔也会遇到RuntimeError(在PySide中可能是this bug)。我仍然不完全确定原因,但由于错误发生的不一致,你可能会安全地强迫它:

class MyWebPage(QWebPage):

def __init__(self, parent=None):
    super(MyWebPage, self).__init__(parent)

    success = False
    while not success:
        try:
            success = self.loadStarted.connect(self.started)
        except RuntimeError:
            success = False

    success = False
    while not success:
        try:
            success = self.loadFinished[bool].connect(self.finished)
        except RuntimeError:
            success = False

如果确实想要安全,那么你可以保留一个循环计数器,如果信号在某个阈值之前没有正确连接,就会使程序崩溃。

答案 1 :(得分:0)

在我升级到PySide 1.2.1之后,这个问题和其他问题最终以一种体面的方式解决了。