1

PyQt4 と python-poppler-qt4 を使用して、PDF ファイルを表示するアプリケーションを作成しようとしています。

これまでのところ、Poppler で生成され、QLabel に設定され、QFrame に追加されたピックスマップを読み込むことで、ドキュメント全体を表示することができました。QFrame は QScrollArea に表示されます。

解像度を上げてピックスマップをもう一度再生成することによって行われるズームを実装するまでは、かなり良いように見えます。このプロセスでは、ドキュメント全体をピックスマップにレンダリングする必要がありますが、これには明らかに時間がかかり、不要な遅延が発生します。

ロジックは、私が見ているページの画像のみを表示することを望んでいます (量子物理学のように聞こえます)。私は2つの選択肢を念頭に置いています:

  1. QLabels を使用して空白のページを作成し、スクロール領域に表示されたときに画像をロードします。
  2. ページを 1 つだけ作成し、表示する直前に先行または後続のページを追加または削除します。

自分が正しい道を進んでいるのか、それとも別の方法があるのか​​ どうかはわかりません。

最初のオプションは、空白ページの可視性によってピックスマップをアップロードする必要がある時期が決まるため、より実現可能に思えます (ただし、ページが非表示のときにそのピックスマップを削除する方法がわかりません)。ただし、この方法でズームが高速になるかどうかはわかりません。たとえば、600 ページのドキュメントを再生成する必要があるためです。ただし、空白のページがあります。

2 番目のオプションでは、ズーム時に一度に 1 ~ 4 ページを再生成する必要があるため、ズームが確実に改善されます。ただし、その 2 番目のケースでは、ページの構築をトリガーする方法がわかりません。

何を提案しますか?

4

2 に答える 2

1

QLabels を忘れて画像を直接描画するのは簡単ではないでしょうか:

from PyQt4.QtGui import *
import sys

app = QApplication(sys.argv)

class Test(QWidget):

    def __init__(self):
        super(Test, self).__init__()
        self.painter = QPainter()
        # placeholder for the real stuff to draw
        self.image = QImage("/tmp/test.jpg")

    def paintEvent(self, evt):
        rect = evt.rect()
        evt.accept()
        print rect
        self.painter.begin(self)
        zoomedImage = self.image   # ... calculate this for your images
        sourceRect = rect          # ... caluclate this ...
        # draw it directly
        self.painter.drawImage(rect, self.image, sourceRect)
        self.painter.end()


t = Test()
t.setGeometry(0,0,600,800)

s = QScrollArea()
s.setWidget(t)

s.setGeometry(0,0,300,400)
s.show()
app.exec_()
于 2012-05-16T15:38:33.343 に答える
1

質問のオプション1を使用して、答えを導き出しました:

def moveEvent(self, event):
    self.checkVisibility()
    event.ignore()

def resizeEvent(self, event):
    self.checkVisibility()
    event.ignore()

def checkVisibility(self):
    print "Checking visibility"
    for page in self.getPages():
        if not page.visibleRegion().isEmpty():
            if page.was_visible:
                pass
            else:
                print page.page_number, "became visible"
                page.was_visible = True
                self.applyImageToPage(page)
        else:
            if page.was_visible:
                print page.page_number, "became invisible"
                page.was_visible = False
            else:
                pass
def applyImageToPage(self, page):
    print "applying image to page", page.page_number
    source = self.getSourcePage(self.getPageNumber(page))
    scale = self.display.scale
        # this is where the error occurs
    image = source.renderToImage(72 * scale, 72 * scale)
    pixmap = QtGui.QPixmap.fromImage(image)
    page.setPixmap(pixmap)
于 2012-05-21T03:53:12.000 に答える