PDF com o QWebView: falta de atualização / repintura após o carregamento
Eu uso oQWebView
(python 3.3 + pyside 1.1.2 + Qt 4.8) como FileViewer. Imagem, texto, HTML, ... tudo bem, mas o PDF tem um problema de exibição. Eu testei dois caminhos possíveis.
webview.load(file)
carrega, mas a tela fica em branco, depois de carregar outro arquivo, tudo funciona bem, ele mostra o arquivopdf.js: após o usosetContent()
com filebase, carrega o webviewer.html / .js com uma página em branco e o círculo de carregamento. A tela só atualiza se eu redimensionar o formulário ou usar as barras de rolagem, mas tudo está bemEu não encontro um evento para "plugin / javascript finished loading", então eu poderia forçar um repaint ou algo assim. Aqui um exemplo de código para o caso 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()
Editar: solução alternativa O caso 1 (plug-in do webkit) tem outro plug-in, ele leva o foco para si mesmo, portanto, essa solução não é aceitável para mim. Eu joguei com o pdf.js novamente e encontrei um workaroud:
self.PreviewBox.setHtml(content, baseUrl = QtCore.QUrl().fromLocalFile(path))
self.PreviewBox.hide()
QtCore.QTimer.singleShot(700, self.PreviewBox.show)
ohide()
deve ser após o preenchimento do conteúdo e o temporizador não deve ser muito baixo.
// jay