Как получить фактические значения x, y по курсору
Рисую перекрестие в классе MainWindow нажатием кнопки gross_.
Далее в классе MyFilter обрабатывается движение мыши в фукции eventFilter. В частности в зависимости от положения прокрутки зависит перирисовска перекрестия.
Вообще конечно хочу сделать перерисовку по по курсору, но не пойму, как получить фактические значения по оси x(индексы) и y. Получилось только узнать координаты event.pos().
Вот здесь во втором коде, как должно выглядеть и работать перекрестие.
P.S. Мне удалось перерисовать перекрестие на линии прокрутки, нужно получить значения по оси x, чтобы отрисовать по курсору.
from PyQt5 import QtCore, QtWidgets, QtChart
import math
import numpy as np
mas =[1.33, 1.15, 1.55, 1.65, 1.64, 1.91, 1.33, 2.3, 1.5, 1.35, 2.52, 1.77, 1.7, 1.87, 2.0, 1.55, 1.73, 2.1,
1.33, 1.15, 1.55, 1.92, 1.64, 1.91, 1.33, 1.71, 1.5, 1.35, 1.22, 1.77, 1.7, 1.87, 2.7, 1.55, 1.73, 2.1,
1.33, 1.15, 1.55, 1.92, 1.64, 1.91, 1.33, 1.71, 1.5, 1.35, 1.22, 1.77, 1.7, 1.87, 2.0, 1.55, 1.73, 2.1]
x = len(mas)
x_ = x - 1
class MyFilter(QtCore.QObject):
def __init__(self, parent=None):
QtCore.QObject.__init__(self, parent)
self.parent = parent
def eventFilter(self, obj, event):
if event.type() == QtCore.QEvent.HoverMove:
ymin = np.amin(mas[int(self.parent.min): int(self.parent.max)])
ymax = np.amax(mas[int(self.parent.min): int(self.parent.max)])
z = (ymin + ymax) / 2.0
index = (self.parent.min + self.parent.max + 1) / 2
chart_view = self.parent.splitter.widget(0)
if isinstance(chart_view, QtChart.QChartView):
chart = chart_view.chart()
s = chart.series()
pos = event.pos()
print(pos)
vectorG = s[1]
vectorV = s[2]
vectorG.clear()
vectorV.clear()
vectorG.append(QtCore.QPointF(self.parent.min, z))
vectorG.append(QtCore.QPointF(self.parent.max + 1, z))
vectorV.append(QtCore.QPointF(index, ymin))
vectorV.append(QtCore.QPointF(index, ymax))
return False
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, start = 1, parent=None):
self.start = start
super().__init__(parent)
self.setMouseTracking(True)
self.step = 30
self.scrollbar = QtWidgets.QScrollBar(
QtCore.Qt.Horizontal,
sliderMoved=self.onAxisSliderMoved,
pageStep=self.step,
)
self.scrollbar.setRange(0, x_)
central_widget = QtWidgets.QWidget()
self.setCentralWidget(central_widget)
self.gross = QtWidgets.QPushButton()
self.gross.setText("Gross")
self.gross.clicked.connect(self.gross_)
self.delete = QtWidgets.QPushButton()
self.delete.setText("Delete")
self.delete.clicked.connect(self.delete_)
self.hbox = QtWidgets.QHBoxLayout()
self.hbox.addWidget(self.gross)
self.hbox.addWidget(self.delete)
self.splitter = QtWidgets.QSplitter(QtCore.Qt.Vertical)
self.lay = QtWidgets.QVBoxLayout(central_widget)
self.lay.insertLayout(0, self.hbox)
self.lay.addWidget(self.splitter, stretch=1)
self.lay.addWidget(self.scrollbar)
self.chart_view = QtChart.QChartView()
self.chart = QtChart.QChart()
self.line_serie = QtChart.QLineSeries()
for i, value in enumerate(mas):
self.line_serie.append(QtCore.QPointF(i, value))
self.chart.addSeries(self.line_serie)
self.chart.createDefaultAxes()
self.chart_view.setChart(self.chart)
self.splitter.addWidget(self.chart_view)
self.min = 1
self.max = 31
self.adjust_axes(self.min, self.max)
self.index_value = 1
def gross_(self):
self.filter = MyFilter(self)
self.installEventFilter(self.filter)
chart_view = self.splitter.widget(0)
chart = chart_view.chart()
line_serieG = QtChart.QLineSeries()
line_serieV = QtChart.QLineSeries()
ymin = np.amin(mas[int(self.min): int(self.max + 1)])
ymax = np.amax(mas[int(self.min): int(self.max + 1)])
z = (ymin + ymax) / 2.0
index = (self.min + self.max + 1) / 2
line_serieG.append(QtCore.QPointF(self.min, z))
line_serieG.append(QtCore.QPointF(self.max + 1, z))
line_serieV.append(QtCore.QPointF(index, ymin))
line_serieV.append(QtCore.QPointF(index, ymax))
vectorG = line_serieG.pointsVector()
vectorV = line_serieV.pointsVector()
print("данные при установке", vectorG, vectorV)
chart.addSeries(line_serieG)
chart.addSeries(line_serieV)
chart.createDefaultAxes()
chart_view.setChart(chart)
self.splitter.addWidget(chart_view)
def delete_(self):
self.removeEventFilter(self.filter)
chart_view = self.splitter.widget(0)
if isinstance(chart_view, QtChart.QChartView):
chart = chart_view.chart()
s = chart.series()
for i in range(1, len(s)):
s[i].clear()
self.update()
def adjust_axes(self, value_min, value_max):
for i in range(self.splitter.count()):
chart_view = self.splitter.widget(i)
if isinstance(chart_view, QtChart.QChartView):
chart = chart_view.chart()
s = chart.series()
for serie in chart.series():
chart.axisX(serie).setRange(value_min, value_max)
@QtCore.pyqtSlot(int)
def onAxisSliderMoved(self, value):
self.index_value = value
value2 = value + self.step
value1 = value
if value2 >= x_:
value2 = x_
value1 = value2 - self.step
self.min = value1
self.max = value2
self.adjust_axes(math.floor(value1), math.ceil(value2))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow(start = 0)
w.show()
sys.exit(app.exec_())