如何在不缩放笔宽的情况下绘制QGraphicsScene?

问题描述 投票:4回答:1

我正在尝试绘制QGraphicScene数据,该数据可能会根据情况而变化几个数量级。由于我使用的笔是化妆品,因此我希望视图与数据的大小无关。但是我得到的却是:

带噪声的正弦波乘以50000:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLmltZ3VyLmNvbS9YSFV1VXpZbS5wbmcifQ==” alt =“规模50000”>

带噪声的正弦波乘以50:

“比例50”

但是,如果我放大这两个图中的一个(两个图都具有相同的放大率,当两个图像看起来相同时,我最终会达到一个水平:

“规模50000“在此处输入图像描述”“ >>

这里发生了什么?为什么仅由于数据值较大而改变笔的宽度。为什么放大后缩放消失了?

重现此代码。左键单击放大图,右键单击缩小。

import sys

from PyQt4 import QtGui as QG
from PyQt4 import QtCore as QC

import numpy as n

class ZoomView(QG.QGraphicsView):
    """Zoomable QGraphicsView"""
    def mouseReleaseEvent(self,event):
        if event.button() == QC.Qt.LeftButton:
            self.scale(1.5,1)
        elif event.button() == QC.Qt.RightButton:
            self.scale(1/1.5,1)

class MainUI(QG.QDialog):
    def __init__(self, parent=None):
        super(MainUI, self).__init__(parent)

        layout = QG.QVBoxLayout()
        self.setLayout(layout)
        button_layout = QG.QHBoxLayout()
        pb3 = QG.QPushButton('add plot')
        button_layout.addWidget(pb3)
        layout.addLayout(button_layout)
        pb3.clicked.connect(self.scene_maker_singleshot)
        scene = QG.QGraphicsScene()
        view = ZoomView(self)
        view.setTransformationAnchor(QG.QGraphicsView.AnchorUnderMouse)
        view.setRenderHint(QG.QPainter.Antialiasing)
        layout.addWidget(view)
        view.setScene(scene)

        self.view = view
        self.scene = scene

    def scene_maker_singleshot(self):
        """Draw scene and fit in view"""
        t1 = 50
        t2 = 100
        QC.QTimer.singleShot(t1, self.make_scene)
        QC.QTimer.singleShot(t2, lambda: self.view.fitInView(self.view.sceneRect()))


    def make_scene(self):
        scale = 50
        #scale = 50000
        noise_amp = 0.2*scale
        points = 1000

        xdata = n.arange(points)
        #generate sine data and random noise
        ydata = n.sin(xdata/(points/10.))*scale +\
                n.random.randint(noise_amp, size=points)
        pen = QG.QPen(QG.QColor("red"))

        for i in xrange(1, xdata.size):
            self.scene.addLine(xdata[i-1], ydata[i-1], xdata[i], ydata[i], pen)


if __name__=="__main__":
    app = QG.QApplication(sys.argv)
    gui = MainUI()
    gui.setFixedSize(500,500)
    gui.show()
    app.exec_()

我正在尝试绘制QGraphicScene数据,该数据可能会根据情况而变化几个数量级。由于我使用的笔是化妆品,我希望视图与大小无关...

qt qt4 pyqt pyqt4
1个回答
0
投票

就像疯狂物理学家告诉您的那样,将笔设置为装饰性或线宽为0(在行为上是相等的,并且您的笔没有刻度)。>>

>> pen.setCosmetic(True);
© www.soinside.com 2019 - 2024. All rights reserved.