Как получить цвет пикселя при нажатии на 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_())

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

→ Ссылка