ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

如何防止QScrollArea缩放过于摇摇晃晃?

2019-11-01 09:09:06  阅读:424  来源: 互联网

标签:zoom pyqt4 qt4 qscrollarea python


我正在使用PyQt4和python-popplerqt4开发PDF阅读器. PDF页面(QPixmaps)显示在QLable中,并垂直放置在QFrame中. QFrame放置在QScrollArea中.

QMainWindow
   |_ QScrollArea
        |_ QFrame (Document: stretch)
            |_ QLabel (Page: fixed size)
            |   |_ QPixmap (stretch)
            |_ QLabel
            |   |_ QPixmap
            |_ etc.

文档的大小由QLabels的固定大小确定. QPixmap设置为相应地拉伸,页面周围的QFrame自然会调整其大小.

当我要求缩放时,使用QLabel.setFixedSize()来逐一调整页面(QLabels)的大小.但是效果令人失望:调整文档的大小看起来既摇摇晃晃又忽悠.相比之下,放大Evince或Mendeley确实很流畅.

我在其他地方读过,在缩放之前调用QFrame.hide(),在帮助之后调用QFrame.show().确实,它只适用于一个小的文档.但是,例如,将其应用于大约700页的PDF,则意味着空白的QScrollArea超过一秒钟.不好.

如何缩放QScrollArea中的文档并产生平滑的缩放效果?

PS:
Poppler.Pages的图像仅针对可见的QLabel收件人绘制.也就是说,调整700页文档的大小不会涉及调整图像的大小.实际上,它将最大调整2到4张图像的大小(分辨率越高,分辨率越高).调整Document对象的大小仅在于调整QLabel的大小,大部分情况下是空的.

解决方法:

经过一些调查和QtForums的一些帮助后,似乎没有简单的解决方案可以通过QScrollArea实现所需的缩放效果.否则请证明我错了.

一个更好的工具(虽然不太容易实现)是QGraphicsView.它具有QGraphicsView.scale(float, float)方法,可以完美地实现缩放!它也更容易使用,因为这种缩放方法甚至不需要维护内容(如果不从头开始加载高分辨率,则可能是图像的分辨率除外).

但是,QGraphicsView的内容QGraphicsScene更加懒惰,需要进行更多的设置,尤其是在布局方面.就我而言,由于我正在使用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_())

标签:zoom,pyqt4,qt4,qscrollarea,python
来源: https://codeday.me/bug/20191101/1982560.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有