PyQt: экземпляр QRectF не обрабатывает событие мыши

Рейтинг: 1Ответов: 1Опубликовано: 06.02.2023

Вот такой код.

from PyQt6.QtWidgets import *
from PyQt6.QtCore import *

import sys

class My_Rect (QRectF):
    
    def __init__(self):
        super().__init__(0,0, 100, 100)
    
    def mousePressEvent(self, event):
        print(event.pos())
     
class My_Canvas(QGraphicsView):
    
    def __init__(self):
        super().__init__()
        self.graphScene = QGraphicsScene()
        self.m = My_Rect()
        self.graphScene.addRect(self.m)
        self.setScene(self.graphScene)
     
app = QApplication(sys.argv)
window = QWidget()
c = My_Canvas()
layout = QVBoxLayout()
layout.addWidget(c)
window.setLayout(layout)
window.show()
app.exec()

Непонятно, почему в экземпляре класса My_Rect() при щелчке мышью не выполняется mousePressEvent()

Ответы

▲ 0Принят

Класс QRectF определяет конечный прямоугольник на плоскости, используя точность с плавающей запятой.
В List of All Members for QRectF нет метода mousePressEvent().

Класс QGraphicsRectItem предоставляет прямоугольный элемент, который можно добавить в QGraphicsScene.
List of All Members for QGraphicsRectItem + QGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event)

Прочитайте В чём разница между сценой и представлением в PyQt5?, я пытался что-то рассказать.

import sys
'''
from PyQt6.QtWidgets import *
from PyQt6.QtCore import *
'''
from PyQt5.Qt import *


class CustomItem(QGraphicsRectItem):
    def __init__(self, parent = None, scene = None):
        super(CustomItem, self).__init__()

        self.setRect(200, 200, 120, 25)        

    def mousePressEvent(self, event):
        self.setBrush(QBrush(Qt.cyan))
        print(f'class CustomItem(QGraphicsRectItem): {event.pos()} # <--- QGraphicsRectItem ')
        super(CustomItem, self).mousePressEvent(event)
        

class My_Rect(QRectF):
    def __init__(self):
        super().__init__(0, 0, 100, 100)

    def mousePressEvent(self, event):
        print(f'class My_Rect(QRectF): {event.pos()} # ??????????????? ')
        super(My_Rect, self).mousePressEvent(event)
        
        
class GraphicsScene(QGraphicsScene):
    def __init__(self):
        super().__init__()
    
    def mousePressEvent(self, event):
        super(GraphicsScene, self).mousePressEvent(event)
        sp = event.scenePos()
        print(f'class GraphicsScene(QGraphicsScene): {sp} # <--- Scene ')
        
     
class My_Canvas(QGraphicsView):
    def __init__(self):
        super().__init__()
        
        self.graphScene = GraphicsScene()    
        self.m = My_Rect()
        self.graphScene.addRect(self.m)
        self.setScene(self.graphScene)

    def mousePressEvent(self, event):
        super(My_Canvas, self).mousePressEvent(event)
        print(f'class My_Canvas(QGraphicsView): {event.pos()}\n')


class Window(QWidget):
    def __init__(self):
        super().__init__()

        self.canvas = My_Canvas() 

        layout = QVBoxLayout(self)
        layout.addWidget(self.canvas)

        self.item = CustomItem() 
        self.canvas.graphScene.addItem(self.item)
        self.canvas.graphScene.update()
        
     
if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec())

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

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