Отследить позицию курсора в pyqtgraph

Можно ли отследить в столбчатой диаграмме на какой именно столбец пользователь нажал?

Например, при нажатии на столбец, будет выводиться в отдельную переменную его значение.

from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph as pg
import sys
import numpy as np

#Класс описывающий столбецы Feed`а
class FeedLabel:
    def __init__(self, col):
        self.__column = col


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        uic.loadUi('untitled.ui', self)
        self.plotWater(bg4)
        self.plotFeed(bg)

    def plotFeed(self, bg1):
        self.graphWidget.addItem(bg1)


    def plotWater(self, bg4):
        self.graphWidget_2.addItem(bg4)


class BarGraph(pg.BarGraphItem):
    def mouseClickEvent(self, event):
        print("Координаты: x=", event.pos().x(), "; y=", event.pos().y())
        print('Столбец: ',round(event.pos().x()))
        self.__column = round(event.pos().x())
        print('self.__column =', self.__column)
        #self.labelEditRequest= (label.setText(self.col))
        #labelEdit(self.labelEditRequest)

x = np.arange(10)
y1 = x
bg = BarGraph(x=x, y=y1-0.5*x, height=y1, width=0.8)
bg4 = BarGraph(x=x, y=y1-0.5*x, height=y1, width=0.8)

MainWindow.plotFeed
MainWindow.plotWater

def main():
    app = QtWidgets.QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())
if __name__ == '__main__':
    main()
    MainWindow.graphWidget.scene().sigMouseClicked.connect(onClick)

п.с. подскажите хотя бы в сторону чего смотреть

.ui файл

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1002, 677)
        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.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.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"))

from pyqtgraph import PlotWidget


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

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

Как вариант для вкладки Feed, если это то что вам надо, то для вкладки Water сделаете аналогично.

import sys
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)                                   # +++ MyPlot

        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.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):                 # + Ui_MainWindow
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

#        uic.loadUi('untitled.ui', self)
        self.setupUi(self)                                              # +

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

        self.graphWidget.addBars(self.bars)


class MyPlot(PlotWidget):
    def __init__(self, parent=None):                                     # + parent
        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_2.setText(f'bar={i};\nx={x:.5f}; 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 mouseClickEvent(self, event):
        print("\nКоординаты: x=", event.pos().x(), "; y=", event.pos().y())
        print('Столбец: ',round(event.pos().x()))
        self.__column = round(event.pos().x())
        print('self.__column =', self.__column)
        #self.labelEditRequest= (label.setText(self.col))
        #labelEdit(self.labelEditRequest)


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

if __name__ == '__main__':
    main()

    print("То что после `main()` не работает !!!!!!!!!!")
    MainWindow.graphWidget.scene().sigMouseClicked.connect(onClick)

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

→ Ссылка