Проблема с реализацией перетаскиваемых кривых в виджете на основе PyqtgraphPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Проблема с реализацией перетаскиваемых кривых в виджете на основе Pyqtgraph

Сообщение Anonymous »

Я пытаюсь реализовать пользовательский виджет на основе Pyqtgraph, который имеет 3 различных Y-оси и DraggablePlotCurveItems, добавленные в видовые ящики, соответствующие различным Y-осам. Действие). Оттуда, в противном случае его нельзя перетащить, что является странным поведением.import sys
import numpy as np
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui, QtWidgets
import pandas as pd

pg.setConfigOptions(antialias=True)

class DraggablePlotCurveItem(pg.PlotCurveItem):
"""
A PlotDataItem that can be dragged horizontally.
"""

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

self.setAcceptHoverEvents(True)
self.drag_start_pos = None
self.original_x_data = None
self.original_y_data = None

self.drag_tolerance = 4

def mouseDragEvent(self, ev):
if ev.button() != QtCore.Qt.MouseButton.LeftButton:
ev.ignore()
return

if ev.isStart():

if self.mouseShape().contains(ev.pos()):

self.drag_start_pos = ev.pos()

self.original_x_data = self.xData.copy()
self.original_y_data = self.yData.copy()
ev.accept()
else:
ev.ignore()

elif ev.isFinish():

self.drag_start_pos = None
self.original_x_data = None
self.original_y_data = None
ev.accept()

else:
if self.drag_start_pos is None:
ev.ignore()
return

delta = ev.pos() - self.drag_start_pos

new_x = self.original_x_data + delta.x()
new_y = self.original_y_data # + delta.y()

# Update the plot with the new data
self.setData(x=new_x, y=new_y)
ev.accept()

def shape(self):

path = super().shape()
stroker = QtGui.QPainterPathStroker()
stroker.setWidth(self.drag_tolerance)
return stroker.createStroke(path)

if __name__ == "__main__":
import numpy as np

data = pd.read_csv(
"PDO_SR_367_STG1_HMMQU5_ASCII_Oilfield.txt",
sep="\t",
)
data["Time"] = pd.to_datetime(data["Time"], format="%m:%d:%Y:%H:%M:%S")

time = (data["Time"].astype("int64") // 10**9).values

pressure = data["Treating Pressure (psi)"].values # [5000:10000]
rate = data["SLUR RATE (bbl/min)"].values # [5000:10000]
proppant_surf = data["PROP CON (PPA)"].values # [5000:10000]
proppant_bh = data["BH PROP CON (PPA)"].values # [5000:10000]

app = pg.mkQApp("Multiple Axes with Draggable Curves")

main_widget = QtWidgets.QWidget()
layout = QtWidgets.QVBoxLayout(main_widget)

button_layout = QtWidgets.QHBoxLayout()

# Create buttons
drag_axis1_btn = QtWidgets.QPushButton("Drag Axis 1")
drag_axis2_btn = QtWidgets.QPushButton("Drag Axis 2")
drag_axis3_btn = QtWidgets.QPushButton("Drag Axis 3")

button_layout.addWidget(drag_axis1_btn)
button_layout.addWidget(drag_axis2_btn)
button_layout.addWidget(drag_axis3_btn)
button_layout.addStretch()

pw = pg.PlotWidget()

layout.addLayout(button_layout)
layout.addWidget(pw)

main_widget.show()
main_widget.setWindowTitle(
"pyqtgraph example: MultiplePlotAxes with Draggable Curves"
)
master_plot = pw.plotItem

master_plot.vb.setMouseEnabled(x=True, y=False)

p1 = pg.ViewBox()
master_plot.showAxis("left")
master_plot.scene().addItem(p1)
master_plot.getAxis("left").linkToView(p1)
p1.setXLink(master_plot)
master_plot.getAxis("left").setLabel("axis 1", color="red")
p1.setMouseEnabled(x=True, y=False)
p2 = pg.ViewBox()
master_plot.showAxis("right")
master_plot.scene().addItem(p2)
master_plot.getAxis("right").linkToView(p2)
p2.setXLink(master_plot)
master_plot.getAxis("right").setLabel("axis 2", color="#0000ff")

p3 = pg.ViewBox()
ax3 = pg.AxisItem("right")
master_plot.layout.addItem(ax3, 2, 3)
master_plot.scene().addItem(p3)
master_plot.vb.setMouseEnabled(x=True, y=False)
p2.setMouseEnabled(x=True, y=False)
p3.setMouseEnabled(x=True, y=False)
ax3.linkToView(p3)
p3.setXLink(master_plot)
ax3.setLabel("axis 3", color="#ff0000")

def drag_axis1_clicked():
p1.setZValue(9999)
p2.setZValue(1)
p3.setZValue(1)
print("Axis 1 is now draggable")

def drag_axis2_clicked():

p1.setZValue(1)
p2.setZValue(9999)
p3.setZValue(1)
print("Axis 2 is now draggable")

def drag_axis3_clicked():
p1.setZValue(1)
p2.setZValue(1)
p3.setZValue(9999)
print("Axis 3 is now draggable")

drag_axis1_btn.clicked.connect(drag_axis1_clicked)
drag_axis2_btn.clicked.connect(drag_axis2_clicked)
drag_axis3_btn.clicked.connect(drag_axis3_clicked)

def updateViews():

p1.setGeometry(master_plot.vb.sceneBoundingRect())
p2.setGeometry(master_plot.vb.sceneBoundingRect())
p3.setGeometry(master_plot.vb.sceneBoundingRect())
p1.linkedViewChanged(master_plot.vb, p1.XAxis)
p2.linkedViewChanged(master_plot.vb, p2.XAxis)
p3.linkedViewChanged(master_plot.vb, p3.XAxis)

updateViews()
master_plot.vb.sigResized.connect(updateViews)

curve1 = DraggablePlotCurveItem(
x=time, y=pressure, pen=pg.mkPen("r", width=1), name="Curve 1"
)
curve2 = DraggablePlotCurveItem(
x=time, y=rate, pen=pg.mkPen("b", width=1), name="Curve 2"
)
curve3 = DraggablePlotCurveItem(
x=time, y=proppant_surf, pen=pg.mkPen("g", width=1), name="Curve 3"
)
curve4 = DraggablePlotCurveItem(
x=time, y=proppant_bh, pen=pg.mkPen("g", width=1), name="Curve 4"
)

p1.addItem(curve1)
p2.addItem(curve2)
p3.addItem(curve3)
p3.addItem(curve4)

p1.autoRange()

pg.exec()

< /code>
Файл данных, используемый для сюжета < /p>
Я ожидаю перетаскивания различных кривых, чтобы быть проще и более плавным: пользователь должен быть в состоянии сосредоточиться на одном Viewbox, и взять любую кривую в этом представлении и перетаскивать его. Текущая реализация работает частично.

Подробнее здесь: https://stackoverflow.com/questions/796 ... sed-widget
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»