2011-10-11 51 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

爲什麼感謝你,總是樂於幫助。 *(提示帽子)* –