如何在QGraphicsScene上绘制而不改变画笔宽度的比例?

5
我正在尝试在QGraphicScene上绘制数据,这些数据根据情况可能会因数量级而异。由于我使用的笔是化妆品,所以我希望视图独立于数据的数量级。但是我得到的结果却是这样的:
乘以50000的正弦波加噪声: scale 50000 乘以50的正弦波加噪声: scale 50 然而,如果我放大这些绘图中的任何一个(同样程度的放大),最终达到的级别是两个图像看起来都一样: scale 50000 zoom enter image description here 这里发生了什么?为什么笔的宽度会因数据值更大而改变?为什么缩放在缩小时消失?
以下是重现此问题的代码。单击绘图将放大,右键单击将缩小。
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_()

我无法重现这个问题:对我来说,两个刻度完全给出相同的结果。这是在 Linux 上使用 python 2.7.5、qt 4.8.5 和 pyqt 4.10.3。 - ekhumoro
啊,我在OSX系统中看到了这个问题。可能是一个平台特定的“特性”。我还发现只有当两件事同时发生时才会出现这种情况:a)QGraphicsView小部件的宽度小于正在绘制的点数,b)垂直轴上的图形数据幅度大于水平轴上的幅度。 - numentar
在Linux中尝试过了,没有问题。我猜我得在OSX中使用一个解决方法。感谢您测试代码! - numentar
3
在执行pen = QG.QPen(QG.QColor("red"))之后,可能需要明确指定pen.setCosmetic(True) - Mad Physicist
1个回答

5

就像Mad Physicist告诉你的那样,将笔设置为化妆品或线宽为0(行为相等),您就拥有了一个不可缩放的笔。

>> pen.setCosmetic(True);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接