退出信号没有被PyQt捕获

时间:2011-10-11 17:28:45

标签: python qt pyqt

编写脚本以将任意HTML呈现为图像,并使用PyQt。我很困惑为什么我的QApplication.exit电话没有让QApplication.exec_返回。关于这个的任何想法?

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>')

1 个答案:

答案 0 :(得分:4)

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

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

就像你不在函数中时编写return一样 - 除非循环没有运行,否则Qt会静静地忽略exit

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

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