我使用QWebView
(python 3.3 + pyside 1.1.2 + Qt 4.8)作为FileViewer。图片,文字,HTML,...都很好,但PDF有显示问题。我测试了两种可能的方法。
webview.load(file)
加载,但是
屏幕为空白,加载另一个文件后,一切正常,它
显示文件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插件)有一个otherbug,它把重点放在自己身上,所以这个解决方案对我来说是不可接受的。我再次玩pdf.js并找到了一个workaroud:
self.PreviewBox.setHtml(content, baseUrl = QtCore.QUrl().fromLocalFile(path))
self.PreviewBox.hide()
QtCore.QTimer.singleShot(700, self.PreviewBox.show)
hide()
必须在内容填充之后,且计时器不能太低。
//周杰伦
答案 0 :(得分:1)
我刚解决了在每次pdf加载之前清理QWebView的类似问题。 小心loadFinished()信号。
在你的例子中:
self.PreviewBox.load(QUrl('about:blank'))
或者,如果我们不喜欢'about:blank',这可能是一个更便携的解决方案:
self.PreviewBox.setHtml('<html><head></head><title></title><body></body></html>')