经过一些调查和 QtForums 的一些帮助后,似乎没有简单的解决方案可以使用 QScrollArea 实现所需的缩放效果。否则请证明我错了。
一个更好的工具,虽然不太容易实现,是一个QGraphicsView
. 它有一种QGraphicsView.scale(float, float)
方法可以完美地进行缩放!它也更容易使用,因为这种缩放方法甚至不需要维护内容(如果你从一开始就没有加载高分辨率,可能除了图像的分辨率)。
QGraphicsScene
但是,QGraphicsView 的内容有点懒惰,需要更多的工作来设置,尤其是在布局方面。就我而言,由于我正在使用 PDF 查看器,因此我需要垂直对齐的图像,这是QGraphicsLinearLayout
可以做到的。
为了后代,这里有一个示例代码,展示了如何将像素图实现到布局中,到场景中到视图中。当然,它还显示了如何缩放内容。
#!/usr/bin/env python
import sys
from PyQt4 import QtGui, QtCore
from popplerqt4 import Poppler
class Application(QtGui.QApplication):
def __init__(self):
QtGui.QApplication.__init__(self, sys.argv)
scene = QtGui.QGraphicsScene()
scene.setBackgroundBrush(QtGui.QColor('darkGray'))
layout = QtGui.QGraphicsLinearLayout(QtCore.Qt.Vertical)
document = Poppler.Document.load('/home/test.pdf')
document.setRenderHint(Poppler.Document.Antialiasing)
document.setRenderHint(Poppler.Document.TextAntialiasing)
for number in range(document.numPages()):
page = document.page(number)
image = page.renderToImage(100, 100)
pixmap = QtGui.QPixmap.fromImage(image)
container = QtGui.QLabel()
container.setFixedSize(page.pageSize())
container.setStyleSheet("Page { background-color : white}")
container.setContentsMargins(0, 0, 0, 0)
container.setScaledContents(True)
container.setPixmap(pixmap)
label = scene.addWidget(container)
layout.addItem(label)
graphicsWidget = QtGui.QGraphicsWidget()
graphicsWidget.setLayout(layout)
scene.addItem(graphicsWidget)
self.view = View(scene)
self.view.show()
class View(QtGui.QGraphicsView):
def __init__(self, parent = None):
QtGui.QGraphicsView.__init__(self, parent)
def wheelEvent(self, event):
if event.delta() > 0:
self.scale(1.1, 1.1)
else:
self.scale(0.9, 0.9)
if __name__ == "__main__":
application = Application()
sys.exit(application.exec_())