我已经用PyQtChart绘制了一个图表,我想用鼠标移动一系列。按右键选择一个系列,然后将其移动到目标位置,释放右键后将该系列放到目标位置。我可以在update_select_series中得到选定的系列,如果我按右键就可以得到原始坐标和目标坐标,这样我就可以在update_series中将系列移动到目标位置,但我不知道如何实现它。
import sys
from PyQt5.QtChart import QAreaSeries, QChart, QChartView, QLineSeries, QValueAxis, QCategoryAxis
from PyQt5.QtCore import QPointF, Qt, QTimer
from PyQt5.QtGui import QColor, QGradient, QLinearGradient, QPainter, QPen
from PyQt5.QtWidgets import QApplication, QMainWindow
app = QApplication(sys.argv)
series0 = QLineSeries()
series0 << QPointF(1, 15) << QPointF(3, 17) << QPointF(7, 16) << QPointF(9, 17) \
<< QPointF(12, 16) << QPointF(16, 17) << QPointF(18, 15)
chart = QChart()
chart.addSeries(series0)
chart.createDefaultAxes()
chartView = QChartView(chart)
def update_select_series():
print('update_select_series')
def update_series():
print('update_series')
series0.pressed.connect(update_select_series)
series0.released.connect(update_series)
window = QMainWindow()
window.setCentralWidget(chartView)
window.resize(400, 300)
window.show()
sys.exit(app.exec_())发布于 2018-02-08 13:51:53
pressed信号包含按下的点的信息,released信号也是如此,也就是说,这两个点是相同的,所以释放的信号只会告诉我们鼠标何时释放,而不会告诉我们在哪里释放。
要解决此问题,您必须获取以下鼠标释放点,为此,您可以使用事件mouseReleaseEvent,这将返回QGraphicsView坐标中的点,然后我们必须将其更改为绘图的坐标,以便可以使用此response。
然后您必须将其传递给series,您可以创建自定义事件并通过postEvent()发送,在series中使用customEvent()方法来获取端点的信息。
要移动序列,您将获得点并添加位移,您必须再次插入它。
import sys
from PyQt5.QtChart import QChart, QChartView, QLineSeries
from PyQt5.QtCore import QPointF, QEvent
from PyQt5.QtWidgets import QApplication, QMainWindow
class ReleasePosEvent(QEvent):
EventType = QEvent.Type(QEvent.registerEventType())
def __init__(self, point):
QEvent.__init__(self, ReleasePosEvent.EventType)
self.point = point
class ChartView(QChartView):
def mouseReleaseEvent(self, event):
p1 = event.pos()
p2 = self.mapToScene(p1)
p3 = self.chart().mapFromScene(p2)
p4 = self.chart().mapToValue(p3)
if self.chart():
for serie in self.chart().series():
QApplication.postEvent(serie, ReleasePosEvent(p4))
QChartView.mouseReleaseEvent(self, event)
class LineSeries(QLineSeries):
def __init__(self, *args, **kwargs):
QLineSeries.__init__(self, *args, **kwargs)
self.start = QPointF()
self.pressed.connect(self.on_pressed)
def on_pressed(self, point):
self.start = point
print("on_pressed", point)
def shift(self, delta):
if not delta.isNull():
for ix in range(self.count()):
p = self.at(ix)
p += delta
self.replace(ix, p)
def customEvent(self, event):
if event.type() == ReleasePosEvent.EventType:
if not self.start.isNull():
dpoint = event.point - self.start
self.shift(dpoint)
self.start = QPointF()
app = QApplication(sys.argv)
series0 = LineSeries()
series0 << QPointF(1, 15) << QPointF(3, 17) << QPointF(7, 16) << QPointF(9, 17) \
<< QPointF(12, 16) << QPointF(16, 17) << QPointF(18, 15)
chart = QChart()
chart.addSeries(series0)
chart.createDefaultAxes()
chartView = ChartView(chart)
window = QMainWindow()
window.setCentralWidget(chartView)
window.resize(400, 300)
window.show()
sys.exit(app.exec_())https://stackoverflow.com/questions/48676797
复制相似问题