【发布时间】:2021-10-10 05:11:39
【问题描述】:
我正在Pyqtgraph 中制作数据可视化应用程序,并希望包含能够选择区域并进一步处理它的功能。我可以通过使用LinearRegionItem 来做到这一点。但我还想展示的是一个带有标签的箭头,表示选择的长度。以下是我使用ArrowItem 的尝试。这样做的问题是箭头长度不符合预期。
我假设箭头长度是错误的,因为从场景缩放到视图或相反。我理解映射的尝试没有意义,因为即使我更改了 QPoint 的参数 mapToScene 的输出也不会改变。
我寻求您的帮助以指导我正确的方向。
from PySide2 import QtCore, QtGui
import numpy as np
import pyqtgraph as pg
class LinearRegionItemWithArrow(pg.LinearRegionItem):
def __init__(self, vb, *args, **kwds):
pg.LinearRegionItem.__init__(self, *args, **kwds)
self.vb = vb
self.headLen = 20
pos1, pos2 = self.getRegion()
# pos1_vb = self.vb.mapToScene(QtCore.QPoint(pos2, 0)).x()
# pos2_vb = self.vb.mapToScene(QtCore.QPoint(pos1, 0)).x()
# print((pos1, pos2), (pos1_vb, pos2_vb))
tailLen = pos2 - pos1 - self.headLen
# tailLen_vb = pos2_vb - pos1_vb
# print(tailLen/tailLen_vb)
self.arrow1 = pg.ArrowItem(self,
angle=0,
headLen=self.headLen,
tipAngle=45,
pos= (pos1, 1),
tailLen = tailLen, #tailLen_vb if tailLen>2*self.headLen else None,
tailWidth = 3,
pen=None,
brush=pg.mkBrush(255, 165, 0),
pxMode=True)
self.sigRegionChanged.connect(self.updateArrows)
def updateArrows(self):
print(self.vb.mapFromScene(QtCore.QPoint(36, 0)))
pos1, pos2 = self.getRegion()
# pos1_vb = self.vb.mapToScene(QtCore.QPoint(pos2, 0)).x()
# pos2_vb = self.vb.mapToScene(QtCore.QPoint(pos1, 0)).x()
# print((pos1, pos2), (pos1_vb, pos2_vb))
tailLen = pos2 - pos1 - self.headLen
# tailLen_vb = pos2_vb - pos1_vb
# print(tailLen/tailLen_vb)
self.arrow1.setPos(pos1, 1)
self.arrow1.setStyle(tailLen = tailLen)# if tailLen>2*self.headLen else None)
data = np.random.normal(size=1000)
win = pg.plot()
plot = win.plot(data, name='data', pen='r', title="Simplest possible plotting example")
lri = LinearRegionItemWithArrow(win.getViewBox(), values=[200, 500])
lri.setZValue(10)
win.addItem(lri)
print(win.mapFromScene(36 , 0))
lri.sigRegionChanged.connect(lambda: win.getViewBox().mapFromScene(QtCore.QPoint(36, 0))) #.mapSceneToView((1.0, 1.0))
## Start Qt event loop unless running in interactive mode or using pyside.
if __name__ == '__main__':
import sys
if sys.flags.interactive != 1 or not hasattr(QtCore, 'PYQT_VERSION'):
pg.QtGui.QApplication.exec_()
【问题讨论】: