Отследить позицию курсора в 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)
