1

QWebView(python 3.3 + pyside 1.1.2 + Qt 4.8) を FileViewer として使用します。画像、テキスト、HTML、... すべて問題ありませんが、PDF には表示上の問題があります。私は2つの可能な方法をテストしました。

  1. 内部 pdf ビューア: 使用後webview.load(file)にロードされますが、画面は空白です。別のファイルをロードすると、すべて正常に動作し、ファイルが表示されます
  2. 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 プラグイン) には他のバグがあり、それ自体にフォーカスが移るため、この解決策は私には受け入れられません。私は再びpdf.jsで遊んで、回避策を見つけました:

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

コンテンツのhide()充填後に行う必要があり、タイマーは低すぎてはいけません。

//ジェイ

4

1 に答える 1

1

PDFをロードするたびにQWebViewをクリーニングするという同様の問題を解決しました。loadFinished() シグナルには注意してください。

あなたの例では:

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

または、「about:blank」が気に入らない場合は、これがより移植性の高い解決策になる可能性があります。

self.PreviewBox.setHtml('<html><head></head><title></title><body></body></html>')
于 2013-06-20T10:06:37.103 に答える