我正在尝试使用PyQt4和python-poppler-qt4创建一个显示PDF文件的应用程序。
到目前为止,我已经设法通过加载用Poppler生成的像素图来显示整个文档,这些像素图设置在QLabel上并附加到QFrame。 QFrame显示在QScrollArea中。
在实现缩放之前,它看起来还不错,这是通过以增量分辨率再次重新生成像素图来完成的。此过程需要将整个文档渲染为像素图,这显然会花费时间,并导致不必要的延迟。
逻辑要求我只显示我看到的页面的图像(听起来像量子物理学)。我有两个选择:
使用QLabel创建空白页面,并在滚动区域中看到它们时将图像加载到它们上;
仅创建一页,并在显示之前添加或删除前一页或后一页。
我不确定我走在正确的道路上还是不确定是否有其他选择。
第一种选择似乎更可行,因为空白页面的可见性决定了何时必须上载像素图(尽管我不知道隐藏页面时如何删除该像素图)。但是,我不确定缩放是否会以这种方式更快,因为必须重新生成600页的文档(尽管页面空白)。
第二种选择肯定会改善缩放,因为缩放时一次必须重新生成1至4页。但是,在第二种情况下,我不确定如何触发页面的构造。
你有什么建议?
最佳答案
忘记QLabel
并直接绘制图像不是很简单:
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_()
关于python - 在滚动区域中显示多个像素图的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10617342/