QGraphicsPixmapItem.setScale在不一致的位置设置像素边界

2024-07-04 08:18:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用QGraphicsPixmapItem.setScale放大图像。然而,在高放大倍数下,即只有几个像素填充窗口时,缩放开始变得非常不稳定。我在PyQt4.8.7和5.6.0,Windows10和Ubuntu16.10上也观察到了同样的现象。编辑:在最近的pyqt5.10上测试,结果相同。编辑:在纯C++ QT测试,见下文。在

下面是一个由鼠标滚轮控制比例因子的示例。在

import numpy as np
try:
    from PyQt5.QtCore import Qt, QRectF
    from PyQt5.QtGui import QImage, QPixmap
    from PyQt5.QtWidgets import QApplication, QGraphicsScene, QGraphicsView, QMainWindow
    qt_ver = 5
except:
    from PyQt4.QtCore import Qt, QRectF
    from PyQt4.QtGui import QImage, QPixmap
    from PyQt4.QtGui import QApplication, QGraphicsScene, QGraphicsView, QMainWindow
    qt_ver = 4

app = QApplication([])


class MyGraphicsView(QGraphicsView):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.scene = QGraphicsScene(QRectF())
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setScene(self.scene)
        im = np.random.randint(255, size=(100, 100, 3), dtype=np.uint8)
        qim = QImage(im, 100, 100, QImage.Format_RGB888)
        pix = QPixmap.fromImage(qim)
        self.pixi = self.scene.addPixmap(pix)
        self.pixi.setOffset(-50, -50)
        self.zoom = 0

    def wheelEvent(self, event):
        if qt_ver == 5:
          delta = event.angleDelta().y()
        else:
          delta = event.delta()
        if delta > 0:
            self.zoom += 1
        elif delta < 0:
            self.zoom -= 1
        self.pixi.setScale(np.exp(self.zoom * 0.1))


window = QMainWindow()
window.setGeometry(100, 100, 900, 900)
view = MyGraphicsView(window)
window.setCentralWidget(view)
window.show()
app.exec()    

看来,规模扩张正受到取整问题的困扰。我做错什么了吗?在

C++中的相同行为,这不是PyQT/Python问题。我想知道这是否是由于float32的低精度造成的离散化效应?这可能很难解决。在

^{pr2}$

编辑

可能是个虫子。我归档了QTBUG-66310。在


Tags: fromimportself编辑npwindowqtpyqt5

热门问题