How to update a graph from another class

≯℡__Kan透↙ 提交于 2020-11-30 02:05:21

问题


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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!