使用QWebView的PDF:加载后缺少刷新/重绘

时间:2013-05-01 09:03:35

标签: python pdf pyside qtwebkit qwebview

我使用QWebView(python 3.3 + pyside 1.1.2 + Qt 4.8)作为FileViewer。图片,文字,HTML,...都很好,但PDF有显示问题。我测试了两种可能的方法。

  1. 内部pdf查看器:使用后webview.load(file)加载,但是 屏幕为空白,加载另一个文件后,一切正常,它 显示文件
  2. pdf.js:在使用setContent()文件库后,它 使用白页和加载圈加载webviewer.html / .js。该 如果我调整表单大小或使用滚动条,屏幕只刷新,但是 那一切都很好
  3. 我没有找到“插件/ javascript完成加载”的事件,所以我可以强制重绘等等。 这里是案例1的示例代码:

    import sys
    from PySide import QtCore, QtGui, QtWebKit #@UnusedWildImport
    
    class DialogTest(QtGui.QDialog):
        def __init__(self, parent = None):
            super(DialogTest, self).__init__(parent)
            self.resize(620, 600)
            self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
    
            self.PreviewBox = QtWebKit.QWebView()   
            self.PreviewBox.settings().setAttribute(QtWebKit.QWebSettings.PluginsEnabled, True)
            self.PreviewBox.settings().setAttribute(QtWebKit.QWebSettings.WebAttribute.DeveloperExtrasEnabled, True)
            self.PreviewBox.settings().setAttribute(QtWebKit.QWebSettings.PrivateBrowsingEnabled, True)
            self.PreviewBox.settings().setAttribute(QtWebKit.QWebSettings.LocalContentCanAccessRemoteUrls, True)
            self.PreviewBox.loadFinished.connect(self._loadfinished)
            self.button_test1 = QtGui.QPushButton("File 1")
            self.button_test1.clicked.connect(self._onselect1)
            self.button_test2 = QtGui.QPushButton("File 2")
            self.button_test2.clicked.connect(self._onselect2)
            layout_Buttons = QtGui.QHBoxLayout()        
            layout_Buttons.addWidget(self.button_test1)        
            #layout_Buttons.addStretch()
            layout_Buttons.addWidget(self.button_test2) 
            layout_Main = QtGui.QVBoxLayout()      
            layout_Main.addLayout(layout_Buttons)  
            layout_Main.addWidget(self.PreviewBox)                  
            self.setLayout(layout_Main)      
        def Execute(self):
            self.show()
            self.exec_()
        def _onselect1(self):
            self.PreviewBox.load(QtCore.QUrl().fromLocalFile("c:\\tmp\\test1.pdf"))
        def _onselect2(self):
            self.PreviewBox.load(QtCore.QUrl().fromLocalFile("c:\\tmp\\test2.pdf"))
        def _loadfinished(self, ok):
            #self.PreviewBox.repaint()
            pass
    app = QtGui.QApplication(sys.argv)
    DialogTest().Execute() 
    

    修改:解决方法 案例1(webkit插件)有一个otherbug,它把重点放在自己身上,所以这个解决方案对我来说是不可接受的。我再次玩pdf.js并找到了一个workaroud:

        self.PreviewBox.setHtml(content, baseUrl = QtCore.QUrl().fromLocalFile(path))
        self.PreviewBox.hide()
        QtCore.QTimer.singleShot(700, self.PreviewBox.show)
    

    hide()必须在内容填充之后,且计时器不能太低。

    //周杰伦

1 个答案:

答案 0 :(得分:1)

我刚解决了在每次pdf加载之前清理QWebView的类似问题。 小心loadFinished()信号。

在你的例子中:

self.PreviewBox.load(QUrl('about:blank'))

或者,如果我们不喜欢'about:blank',这可能是一个更便携的解决方案:

self.PreviewBox.setHtml('<html><head></head><title></title><body></body></html>')