【发布时间】:2018-01-19 08:44:19
【问题描述】:
我有一个与以下问题非常相似的应用程序:Draw half infinite lines?
我想要一条具有多个阈值的无限线。
问题中提供的解决方案是一个很好的起点:https://stackoverflow.com/a/37836348/7163293
我试图通过修改__init__ 中的movable 属性来使线条可移动,并添加一个setMovable 方法,就像源代码中的源代码一样:
from pyqtgraph.Qt import QtGui
import numpy as np
import pyqtgraph as pg
class InfiniteLineWithBreak(pg.GraphicsObject):
def __init__(self, changeX, levelsY, pen=None):
pg.GraphicsObject.__init__(self)
self.changeX = changeX
self.levelsY = levelsY
self.maxRange = [None, None]
self.moving = False
self.movable = True
self.setMovable(self.movable)
self.mouseHovering = False
pen = (200, 200, 100)
self.setPen(pen)
self.setHoverPen(color=(255,0,0), width=self.pen.width())
self.currentPen = self.pen
def setMovable(self, m):
"""Set whether the line is movable by the user."""
self.movable = m
self.setAcceptHoverEvents(m)
def setBounds(self, bounds):
self.maxRange = bounds
self.setValue(self.value())
def setPen(self, *args, **kwargs):
self.pen = pg.fn.mkPen(*args, **kwargs)
if not self.mouseHovering:
self.currentPen = self.pen
self.update()
def setHoverPen(self, *args, **kwargs):
self.hoverPen = pg.fn.mkPen(*args, **kwargs)
if self.mouseHovering:
self.currentPen = self.hoverPen
self.update()
def boundingRect(self):
br = self.viewRect()
return br.normalized()
def paint(self, p, *args):
br = self.boundingRect()
p.setPen(self.currentPen)
# three lines (left border to change point, change point vertical, change point to right)
p.drawLine(pg.Point(br.left(), self.levelsY[0]), pg.Point(self.changeX, self.levelsY[0]))
p.drawLine(pg.Point(self.changeX, self.levelsY[0]), pg.Point(self.changeX, self.levelsY[1]))
p.drawLine(pg.Point(self.changeX, self.levelsY[1]), pg.Point(br.right(), self.levelsY[1]))
def dataBounds(self, axis, frac=1.0, orthoRange=None):
if axis == 0:
return None ## x axis should never be auto-scaled
else:
return (0,0)
def setMouseHover(self, hover):
pass
app = QtGui.QApplication([])
w = pg.GraphicsWindow()
w.resize(1000, 600)
v = w.addPlot(y=np.random.normal(size=100))
v.addItem(InfiniteLineWithBreak(changeX=50, levelsY=(-1, 1)))
app.exec_()
但是,修改后的线仍然无法移动。所以我有点卡在这里。有人能提供一些指点吗?
此外,理想情况下,应用程序上的线条应该可以分段移动。因此,当用户拖动一条线时,只有断点之间的部分在移动。所以理想情况下,我想要这样的东西:
Draggable line with draggable points
在我的应用程序中。理想情况下,它看起来像
阈值点水平(TH_Px_L1)可拖动,但不能定时(TH_Px_T1),所以点只能垂直移动。
如果有人也可以在第二个项目上提供帮助并提供一些非常有用的指示或解决方案。
【问题讨论】:
-
@eyllanesc 感谢您的建议。我添加了我正在运行的代码。
-
要移动白线还是黄线?
-
@eyllanesc 黄线,谢谢
-
查看 InfiniteLine 的源代码,您缺少那些实际上使线可拖动的方法,例如
mouseDragEvent和下面列出的那些。但是,由于您想单独移动部分线条,最好使用一组pyqtgraph.PlotCurveItems 并使其可以单独拖动。
标签: python drag-and-drop pyqt pyqt4 pyqtgraph