Как узнать на какой именно график нажал пользователь
Есть две вкладки, в каждой из которых есть график. При нажатии на бар, он возвращает его позицию, и эту позицию мне надо занести в 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()
