Как узнать на какой именно график нажал пользователь

Есть две вкладки, в каждой из которых есть график. При нажатии на бар, он возвращает его позицию, и эту позицию мне надо занести в labelы соответствующей вкладки.

Я думаю, что для того что бы это сделать, надо добавить в условие еще проверку на то, на какой именно график (из вкладки Feed или Water) пользователь нажал.

Как это реализовать? Как понять на какой график именно нажал пользователь? Каким методом надо воспользоваться?

Код программы:

import numpy as np
from PyQt5 import QtGui, QtWidgets, QtCore

from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph as pg
from pyqtgraph import PlotWidget


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
#        MainWindow.resize(1002, 677)
        MainWindow.resize(720, 500)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        self.tabWidget.setGeometry(QtCore.QRect(10, 10, 701, 391))
        self.tabWidget.setObjectName("tabWidget")
        self.Feed = QtWidgets.QWidget()
        self.Feed.setObjectName("Feed")

#        self.graphWidget = PlotWidget(self.Feed)
        self.graphWidget = MyPlot(self.Feed)                                  

        self.graphWidget.setGeometry(QtCore.QRect(10, 60, 671, 291))
        self.graphWidget.setObjectName("graphWidget")
        self.widget = QtWidgets.QWidget(self.Feed)
        self.widget.setGeometry(QtCore.QRect(10, 10, 671, 41))
        self.widget.setObjectName("widget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label = QtWidgets.QLabel(self.widget)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label.setFont(font)
        self.label.setFrameShape(QtWidgets.QFrame.Box)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        self.label_2 = QtWidgets.QLabel(self.widget)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label_2.setFont(font)
        self.label_2.setFrameShape(QtWidgets.QFrame.Box)
        self.label_2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout.addWidget(self.label_2)
        self.label_3 = QtWidgets.QLabel(self.widget)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label_3.setFont(font)
        self.label_3.setFrameShape(QtWidgets.QFrame.Box)
        self.label_3.setAlignment(QtCore.Qt.AlignCenter)
        self.label_3.setObjectName("label_3")
        self.horizontalLayout.addWidget(self.label_3)
        self.label_4 = QtWidgets.QLabel(self.widget)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label_4.setFont(font)
        self.label_4.setFrameShape(QtWidgets.QFrame.Box)
        self.label_4.setAlignment(QtCore.Qt.AlignCenter)
        self.label_4.setObjectName("label_4")
        self.horizontalLayout.addWidget(self.label_4)
        self.label_5 = QtWidgets.QLabel(self.widget)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label_5.setFont(font)
        self.label_5.setFrameShape(QtWidgets.QFrame.Box)
        self.label_5.setAlignment(QtCore.Qt.AlignCenter)
        self.label_5.setObjectName("label_5")
        self.horizontalLayout.addWidget(self.label_5)
        self.tabWidget.addTab(self.Feed, "")
        self.Water = QtWidgets.QWidget()
        self.Water.setObjectName("Water")
       # self.graphWidget_2 = PlotWidget(self.Water)
        self.graphWidget_2 = MyPlot(self.Water)
        self.graphWidget_2.setGeometry(QtCore.QRect(10, 60, 671, 291))
        self.graphWidget_2.setObjectName("graphWidget_2")
        self.layoutWidget = QtWidgets.QWidget(self.Water)
        self.layoutWidget.setGeometry(QtCore.QRect(10, 10, 671, 41))
        self.layoutWidget.setObjectName("layoutWidget")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.layoutWidget)
        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_6 = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label_6.setFont(font)
        self.label_6.setFrameShape(QtWidgets.QFrame.Box)
        self.label_6.setAlignment(QtCore.Qt.AlignCenter)
        self.label_6.setObjectName("label_6")
        self.horizontalLayout_2.addWidget(self.label_6)
        self.label_7 = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label_7.setFont(font)
        self.label_7.setFrameShape(QtWidgets.QFrame.Box)
        self.label_7.setAlignment(QtCore.Qt.AlignCenter)
        self.label_7.setObjectName("label_7")
        self.horizontalLayout_2.addWidget(self.label_7)
        self.label_8 = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label_8.setFont(font)
        self.label_8.setFrameShape(QtWidgets.QFrame.Box)
        self.label_8.setAlignment(QtCore.Qt.AlignCenter)
        self.label_8.setObjectName("label_8")
        self.horizontalLayout_2.addWidget(self.label_8)
        self.label_9 = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label_9.setFont(font)
        self.label_9.setFrameShape(QtWidgets.QFrame.Box)
        self.label_9.setAlignment(QtCore.Qt.AlignCenter)
        self.label_9.setObjectName("label_9")
        self.horizontalLayout_2.addWidget(self.label_9)
        self.label_10 = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label_10.setFont(font)
        self.label_10.setFrameShape(QtWidgets.QFrame.Box)
        self.label_10.setAlignment(QtCore.Qt.AlignCenter)
        self.label_10.setObjectName("label_10")
        self.horizontalLayout_2.addWidget(self.label_10)
        self.tabWidget.addTab(self.Water, "")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "TextLabel"))
        self.label_2.setText(_translate("MainWindow", "TextLabel"))
        self.label_3.setText(_translate("MainWindow", "TextLabel"))
        self.label_4.setText(_translate("MainWindow", "TextLabel"))
        self.label_5.setText(_translate("MainWindow", "TextLabel"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.Feed), _translate("MainWindow", "Feed"))
        self.label_6.setText(_translate("MainWindow", "TextLabel"))
        self.label_7.setText(_translate("MainWindow", "TextLabel"))
        self.label_8.setText(_translate("MainWindow", "TextLabel"))
        self.label_9.setText(_translate("MainWindow", "TextLabel"))
        self.label_10.setText(_translate("MainWindow", "TextLabel"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.Water), _translate("MainWindow", "Water"))


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):                
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        self.setupUi(self)                                             

        x = np.arange(5)
        y1 = x
        self.barFeed = MyBarGraphItem()
        self.barFeed.setAttr(x=x, y=y1-0.5*x, height=y1, width=0.8)

        self.barWater = MyBarGraphItem()
        self.barWater.setAttr(x=x, y=y1-0.5*x, height=y1, width=0.8)
        self.graphWidget.addBars(self.barFeed)
        self.graphWidget_2.addBars(self.barWater)





class MyPlot(PlotWidget):
    def __init__(self, parent=None):                                     
        super().__init__(parent)
        self.bars = None


    def mousePressEvent(self, ev):
        pos = self.getPlotItem().vb.mapSceneToView(ev.pos())
        if self.bars is not None:
            x, y = pos.x(), pos.y()

            for i,_ in enumerate(self.bars.x):
                if self.bars.x[i]-self.bars.width/2 < x < self.bars.x[i]+self.bars.width/2\
                        and 0 < y < self.bars.height[i]:
                    print('\nclicked on bar '+str(i))
                    print('clicked on bar '+str(x)+' ;    '+str(y))
                    self.window().label.setText(f'bar={i}')
                    self.window().label_2.setText(f'x={x:.5f}')
                    self.window().label_3.setText(f'y={y:.5f}')
                    ev.accept()




        super().mousePressEvent(ev)

    def addBars(self, bars):
        self.bars = bars
        self.addItem(self.bars)


class MyBarGraphItem(pg.BarGraphItem):
    def __init__(self):
        super().__init__()

    def setAttr(self, **opts):
        print(opts)
        if 'x' in opts:
            self.x = opts['x']
        if 'height' in opts:
            self.height = opts['height']
        if 'width' in opts:
            self.width = opts['width']
        if 'y' in opts:
            self.y = opts['y']
        super().setOpts(**opts)



def main():
    app = QtWidgets.QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

Как я думаю это реализовать:

    def mousePressEvent(self, ev):
        pos = self.getPlotItem().vb.mapSceneToView(ev.pos())
        if self.bars is not None:
            x, y = pos.x(), pos.y()

            for i,_ in enumerate(self.bars.x):
                # Если пользователь нажал на бар графика Feed то лабелы меняются в вкладке Feed
                if self.bars.x[i]-self.bars.width/2 < x < self.bars.x[i]+self.bars.width/2\
                        and 0 < y < self.bars.height[i]: #and (Выбранный график = График из вкладки Feed) 
                    print('\nclicked on bar '+str(i))
                    print('clicked on bar '+str(x)+' ;    '+str(y))
                    self.window().label.setText(f'bar={i}')
                    self.window().label_2.setText(f'x={x:.5f}')
                    self.window().label_3.setText(f'y={y:.5f}')
                    ev.accept()

                # Если пользователь нажал на бар графика Water то лабелы меняются в вкладке Water
            for i,_ in enumerate(self.bars.x):
                if self.bars.x[i]-self.bars.width/2 < x < self.bars.x[i]+self.bars.width/2\
                        and 0 < y < self.bars.height[i]: #and (Выбранный график = График из вкладки Water)
                    print('\nclicked on bar '+str(i))
                    print('clicked on bar '+str(x)+' ;    '+str(y))
                    self.window().label_6.setText(f'bar={i}')
                    self.window().label_7.setText(f'x={x:.5f}')
                    self.window().label_8.setText(f'y={y:.5f}')
                    ev.accept()

        super().mousePressEvent(ev)

    def addBars(self, bars):
        self.bars = bars
        self.addItem(self.bars)

Ответы (1 шт):

Автор решения: S. Nick

я отметил для вас изменения, которые внес в ваш пример.

import numpy as np
from PyQt5 import QtGui, QtWidgets, QtCore

from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph as pg
from pyqtgraph import PlotWidget


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
#        MainWindow.resize(1002, 677)
        MainWindow.resize(720, 500)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        self.tabWidget.setGeometry(QtCore.QRect(10, 10, 701, 391))
        self.tabWidget.setObjectName("tabWidget")

        self.Feed = QtWidgets.QWidget()
        self.Feed.setObjectName("Feed")

#        self.graphWidget = PlotWidget(self.Feed)
        self.graphWidget = MyPlot(self.Feed)                                  

        self.graphWidget.setGeometry(QtCore.QRect(10, 60, 671, 291))
        self.graphWidget.setObjectName("graphWidget")
        self.widget = QtWidgets.QWidget(self.Feed)
        self.widget.setGeometry(QtCore.QRect(10, 10, 671, 41))
        self.widget.setObjectName("widget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label = QtWidgets.QLabel(self.widget)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label.setFont(font)
        self.label.setFrameShape(QtWidgets.QFrame.Box)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        self.label_2 = QtWidgets.QLabel(self.widget)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label_2.setFont(font)
        self.label_2.setFrameShape(QtWidgets.QFrame.Box)
        self.label_2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout.addWidget(self.label_2)
        self.label_3 = QtWidgets.QLabel(self.widget)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label_3.setFont(font)
        self.label_3.setFrameShape(QtWidgets.QFrame.Box)
        self.label_3.setAlignment(QtCore.Qt.AlignCenter)
        self.label_3.setObjectName("label_3")
        self.horizontalLayout.addWidget(self.label_3)
        self.label_4 = QtWidgets.QLabel(self.widget)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label_4.setFont(font)
        self.label_4.setFrameShape(QtWidgets.QFrame.Box)
        self.label_4.setAlignment(QtCore.Qt.AlignCenter)
        self.label_4.setObjectName("label_4")
        self.horizontalLayout.addWidget(self.label_4)
        self.label_5 = QtWidgets.QLabel(self.widget)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label_5.setFont(font)
        self.label_5.setFrameShape(QtWidgets.QFrame.Box)
        self.label_5.setAlignment(QtCore.Qt.AlignCenter)
        self.label_5.setObjectName("label_5")
        self.horizontalLayout.addWidget(self.label_5)
        self.tabWidget.addTab(self.Feed, "")

        self.Water = QtWidgets.QWidget()
        self.Water.setObjectName("Water")
       # self.graphWidget_2 = PlotWidget(self.Water)
        self.graphWidget_2 = MyPlot(self.Water)
        self.graphWidget_2.setGeometry(QtCore.QRect(10, 60, 671, 291))
        self.graphWidget_2.setObjectName("graphWidget_2")
        self.layoutWidget = QtWidgets.QWidget(self.Water)
        self.layoutWidget.setGeometry(QtCore.QRect(10, 10, 671, 41))
        self.layoutWidget.setObjectName("layoutWidget")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.layoutWidget)
        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_6 = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label_6.setFont(font)
        self.label_6.setFrameShape(QtWidgets.QFrame.Box)
        self.label_6.setAlignment(QtCore.Qt.AlignCenter)
        self.label_6.setObjectName("label_6")
        self.horizontalLayout_2.addWidget(self.label_6)
        self.label_7 = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label_7.setFont(font)
        self.label_7.setFrameShape(QtWidgets.QFrame.Box)
        self.label_7.setAlignment(QtCore.Qt.AlignCenter)
        self.label_7.setObjectName("label_7")
        self.horizontalLayout_2.addWidget(self.label_7)
        self.label_8 = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label_8.setFont(font)
        self.label_8.setFrameShape(QtWidgets.QFrame.Box)
        self.label_8.setAlignment(QtCore.Qt.AlignCenter)
        self.label_8.setObjectName("label_8")
        self.horizontalLayout_2.addWidget(self.label_8)
        self.label_9 = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label_9.setFont(font)
        self.label_9.setFrameShape(QtWidgets.QFrame.Box)
        self.label_9.setAlignment(QtCore.Qt.AlignCenter)
        self.label_9.setObjectName("label_9")
        self.horizontalLayout_2.addWidget(self.label_9)
        self.label_10 = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label_10.setFont(font)
        self.label_10.setFrameShape(QtWidgets.QFrame.Box)
        self.label_10.setAlignment(QtCore.Qt.AlignCenter)
        self.label_10.setObjectName("label_10")
        self.horizontalLayout_2.addWidget(self.label_10)
        self.tabWidget.addTab(self.Water, "")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "TextLabel"))
        self.label_2.setText(_translate("MainWindow", "TextLabel"))
        self.label_3.setText(_translate("MainWindow", "TextLabel"))
        self.label_4.setText(_translate("MainWindow", "TextLabel"))
        self.label_5.setText(_translate("MainWindow", "TextLabel"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.Feed), _translate("MainWindow", "Feed"))
        self.label_6.setText(_translate("MainWindow", "TextLabel"))
        self.label_7.setText(_translate("MainWindow", "TextLabel"))
        self.label_8.setText(_translate("MainWindow", "TextLabel"))
        self.label_9.setText(_translate("MainWindow", "TextLabel"))
        self.label_10.setText(_translate("MainWindow", "TextLabel"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.Water), _translate("MainWindow", "Water"))


class MyPlot(PlotWidget):
    def __init__(self, parent=None):                                     
        super().__init__(parent)
        self.bars = None


    def mousePressEvent(self, ev):
        pos = self.getPlotItem().vb.mapSceneToView(ev.pos())
        if self.bars is not None:
            x, y = pos.x(), pos.y()

# ++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
            print(f'\nself       =  {self.objectName()}')                            # <<<=====<
            if self.objectName() == "graphWidget":
                for i,_ in enumerate(self.bars.x):
                    if self.bars.x[i]-self.bars.width/2 < x < self.bars.x[i]+self.bars.width/2\
                            and 0 < y < self.bars.height[i]:
                        print('\nclicked on bar '+str(i))
                        print('clicked on bar '+str(x)+' ;    '+str(y))
                        self.window().label.setText(f'bar={i}')
                        self.window().label_2.setText(f'x={x:.5f}')
                        self.window().label_3.setText(f'y={y:.5f}')
                    ev.accept()
            elif self.objectName() == "graphWidget_2":
                for i,_ in enumerate(self.bars.x):
                    if self.bars.x[i]-self.bars.width/2 < x < self.bars.x[i]+self.bars.width/2\
                            and 0 < y < self.bars.height[i]:
                        print('\nclicked on bar '+str(i))
                        print('clicked on bar '+str(x)+' ;    '+str(y))
                        self.window().label_6.setText(f'bar={i}')
                        self.window().label_7.setText(f'x={x:.5f}')
                        self.window().label_8.setText(f'y={y:.5f}')
                    ev.accept()            
# ++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^            

        super().mousePressEvent(ev)

    def addBars(self, bars):
        self.bars = bars
        self.addItem(self.bars)


class MyBarGraphItem(pg.BarGraphItem):
    def __init__(self):
        super().__init__()

    def setAttr(self, **opts):
        print(opts)
        if 'x' in opts:
            self.x = opts['x']
        if 'height' in opts:
            self.height = opts['height']
        if 'width' in opts:
            self.width = opts['width']
        if 'y' in opts:
            self.y = opts['y']
        super().setOpts(**opts)


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):                
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        self.setupUi(self)                                             

        x = np.arange(5)
        y1 = x
        self.barFeed = MyBarGraphItem()
        self.barFeed.setAttr(x=x, y=y1-0.5*x, height=y1, width=0.8)

        self.barWater = MyBarGraphItem()
        self.barWater.setAttr(x=x, y=y1-0.5*x, height=y1, width=0.8)
        self.graphWidget.addBars(self.barFeed)
        self.graphWidget_2.addBars(self.barWater)


def main():
    import sys
    app = QtWidgets.QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

введите сюда описание изображения

→ Ссылка