我将QWebView(python 3.3 + pyside 1.1.2 + Qt 4.8)用作FileViewer。图片,文本,HTML等都可以,但是PDF有显示问题。我测试了两种可能的方法。


内部pdf查看器:使用webview.load(file)后会加载,但是
屏幕为空白,加载另一个文件后,一切正常,它
显示文件
pdf.js:将setContent()用于文件库后,它
使用白页和加载圆圈加载webviewer.html / .js。的
仅当我调整表单大小或使用滚动条时,屏幕才会刷新,但是
那一切都很好


我找不到“插件/ 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插件)有另一个bug,它专注于自身,因此我不接受此解决方案。我再次玩了pdf.js,发现了一个工作方式:

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


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

//杰

最佳答案

我只是解决了在每次加载pdf之前清洁QWebView的类似问题。
注意loadFinished()信号。

在您的示例中:

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


或者,如果我们不喜欢“ about:blank”,那么这可能是一种更可移植的解决方案:

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

关于python - 具有QWebView的PDF:加载后缺少刷新/重新绘制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16315418/

10-12 00:36
查看更多