2011-10-11 52 views
3

编写脚本将任意HTML呈现为图像,并使用PyQt。我很困惑,为什么我的QApplication.exit电话不是让QApplication.exec_回报。对此有何想法?退出信号未被PyQt捕获

class ScreenshotterApplication(QApplication): 

    def __init__(self, args, html): 
     QApplication.__init__(self, args) 

     self.html = html 

     self.browser = QWebView() 
     self.browser.resize(0, 0) 
     self.browser.loadFinished.connect(self.save) 
     self.browser.loadProgress.connect(self.progress) 

    def render(self): 
     self.browser.setHtml(self.html) 

    def progress(self, progress): 
     print '%d%%' % progress 

    def save(self, finished): 
     success = False 
     if finished: 
      print 'saving...' 
      # ... snip ... 

      success = pixmap.save('screenshot.png') 
      if success: 
       print 'saved as "screenshot.png"' 

     QApplication.exit(0 if success else 1) 

    def exec_(self, *args, **kwargs): 
     self.render() 
     super(QApplication, self).exec_(*args, **kwargs) 

def take_screenshot(html): 
    app = ScreenshotterApplication(sys.argv, html) 
    return app.exec_() 

if __name__ == "__main__": 
    print take_screenshot('<h1 style="width: 500px">Hello, World!</h1>') 
+0

哦,它的工作原理。我不确定我是否改变了一些东西,但不管我现在做什么,它都不会正确退出。 –

回答

4

QApplication.exit告诉应用程序离开主事件循环,即从exec_()尽快返回。

你的问题是,静态HTML的一小块很容易检索和渲染,QtWebKit在setHtml被调用时没有问题。没有延迟或后台处理,一切都在setHtml返回之前完成。因此,save在之前称为,主循环开始(即在调用exec_之前)。

这就像写return当你在一个函数不是 - 除了Qt的会忽略exit悄然如果循环没有运行。

解决方案:在您的connect调用中使用QueuedConnection来强制信号排队,并在事件循环开始时发送。当然,如果循环已经在运行,这也将起作用。

self.browser.loadFinished.connect(self.save, Qt.QueuedConnection) 
+0

先生,您是一位绅士和学者。 –

+0

为什么感谢你,总是乐于帮助。 *(提示帽子)* –