Как получить цвет пикселя при нажатии на QGraphicsScene?
Как получить цвет пикселя при нажатии на QGraphicsScene?
main.py
import sys
from PyQt5.QtCore import QPointF, pyqtSignal
from PyQt5.QtWidgets import QMainWindow, QGraphicsScene
from PyQt5 import QtWidgets, QtCore, QtGui
import main_ui
class GraphicsScene(QGraphicsScene):
clicked = pyqtSignal(QPointF)
def mousePressEvent(self, event):
sp = event.scenePos()
self.clicked.emit(sp)
super().mousePressEvent(event)
class MainWindow(QMainWindow, main_ui.Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.scene = GraphicsScene()
self.scene.setSceneRect(0, 0, 256, 192)
self.setMouseTracking(True)
self.graphicsView.setScene(self.scene)
self.scene.clicked.connect(self.point1)
self.pen = QtGui.QPen(QtCore.Qt.black)
self.brush_color = QtGui.QColor("green")
self.scene.addRect(10, 10, 20, 20, self.pen, self.brush_color)
def point1(self, p):
x1 = p.x()
y1 = p.y()
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
ui:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(279, 282)
MainWindow.setMinimumSize(QtCore.QSize(279, 282))
MainWindow.setMaximumSize(QtCore.QSize(279, 282))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.widget = QtWidgets.QWidget(self.centralwidget)
self.widget.setGeometry(QtCore.QRect(10, 10, 258, 213))
self.widget.setObjectName("widget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.widget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.graphicsView = QtWidgets.QGraphicsView(self.widget)
self.graphicsView.setObjectName("graphicsView")
self.verticalLayout.addWidget(self.graphicsView)
self.label = QtWidgets.QLabel(self.widget)
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 279, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.show()
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "Color:"))
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Как вариант. Обратите внимание, что я добавил класс GraphicsView, который встроил в форму созданную в Qt Designer. В котором собственно и получаю цвет пикселя. Попробуйте.
import sys
from PyQt5.Qt import *
from PyQt5 import QtWidgets, QtCore, QtGui
#import main_ui
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(279, 282)
# MainWindow.setMinimumSize(QtCore.QSize(279, 282))
# MainWindow.setMaximumSize(QtCore.QSize(279, 282))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.widget = QtWidgets.QWidget(self.centralwidget)
self.widget.setGeometry(QtCore.QRect(10, 10, 258, 213))
self.widget.setObjectName("widget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.widget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
# self.graphicsView = QtWidgets.QGraphicsView(self.widget)
self.graphicsView = GraphicsView() # +++
self.graphicsView.setObjectName("graphicsView")
self.verticalLayout.addWidget(self.graphicsView)
self.label = QtWidgets.QLabel(self.widget)
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 279, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
# self.show()
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "Color:"))
class GraphicsView(QGraphicsView): # +++
clicked = pyqtSignal(str, str)
def mousePressEvent(self, event):
super(GraphicsView, self).mousePressEvent(event)
self.setCursor(Qt.CrossCursor)
# Получить положение мыши на экране
pos = event.globalPos()
image = QApplication.primaryScreen().grabWindow(
int(QApplication.desktop().winId()),
pos.x() - 6, pos.y() - 6, 13, 13).toImage()
color = image.pixelColor(6, 6)
if color.isValid():
self.clicked.emit('View', color.name())
def mouseReleaseEvent(self, event):
super(GraphicsView, self).mouseReleaseEvent(event)
self.setCursor(Qt.ArrowCursor)
class GraphicsScene(QGraphicsScene):
clicked = pyqtSignal(str, QPointF)
def mousePressEvent(self, event):
super(GraphicsScene, self).mousePressEvent(event)
sp = event.scenePos()
self.clicked.emit('Scene', sp)
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.layout = QtWidgets.QHBoxLayout(self.centralwidget)
self.layout.addWidget(self.widget)
self.scene = GraphicsScene()
self.scene.setSceneRect(0, 0, 256, 192)
self.setMouseTracking(True)
self.graphicsView.setScene(self.scene)
self.scene.clicked.connect(self.point1)
self.graphicsView.clicked.connect(self.point1) # +++
self.pen = QtGui.QPen(QtCore.Qt.black)
self.brush_color = QtGui.QColor("#4AA96C")
self.scene.addRect(10, 10, 20, 20, self.pen, self.brush_color)
self.ellipse = self.scene.addEllipse(
QRectF(150, 150, 50, 50),
brush=QBrush(QColor(Qt.blue)),
pen=QPen(QtCore.Qt.red, 5)
)
self.ellipse.setFlags(QGraphicsItem.ItemIsSelectable | QGraphicsItem.ItemIsMovable)
self.ellipse.setZValue(1)
self.pic = self.scene.addPixmap(QPixmap('Ok.png').scaled(60, 60))
self.pic.setOffset(100, 50)
def point1(self, text, value):
if text == 'Scene':
self.label.setText(f'x1 = {value.x()}, y1 = {value.y()}. Color: ')
if text == 'View':
self.label.setText(f'{self.label.text()} {value}')
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())

