问题
I use the "gross_" button to enable the mouse movement event. The class "MyFilte" handles the "mouse movement" event" In the same class, I plan to update the crosshair depending on the mouse position. To do this, I need to access the null widget, but I do not know how to do this.
I was able to track the cursor position. Updating the code. Can't draw a crosshair on the event, and an error occurs: "AttributeError: 'MainWindow' object has no attribute 'QPainter'"
Also interested in the possibility of using this crosshair when adding additional graphs at the bottom.
from PyQt5 import QtCore, QtGui, QtWidgets, QtChart
import math
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 eventFilter(self, obj, event):
if event.type() == QtCore.QEvent.HoverMove:
self.pos = event.pos()
window = MainWindow()
q = window.QPainter(self)
q.drawLine(self.pos.x(), 0, self.pos.x(), self.width())
q.drawLine(0, self.pos.y(), self.width(), self.pos.y())
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.installEventFilter(self.filter)
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()
print(len(s))
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.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_())
来源:https://stackoverflow.com/questions/64625007/how-to-update-a-graph-from-another-class