Рисование границы QGraphicsPixmapItem при наведении курсора - PullRequest
2 голосов
/ 23 мая 2019

Я пытаюсь создать свой собственный QGraphicsPixmapItem, где я могу активировать в режиме наведения, и я хочу закрасить черную рамку, когда наведу курсор мыши на прямоугольник элемента, и вернуться к нормальному состоянию, когда я покидаю пространство прямоугольника.

Я начал этот код, но не знаю, что делать дальше.Также хотел сделать paintEvent, но QGraphicsPixmapItems не имеет этого.Так что я еще больше сбит с толку, так как не думаю, что метод рисования был бы таким же.

class PixmapItem(QGraphicsPixmapItem):
    def __init__(self, pixmap, rect, parent=None):
        super().__init__(parent)
        self.pixmap = pixmap
        self.setPixmap(self.pixmap)
        self.rect = rect
        self.setAcceptHoverEvents(True)

    def hoverEnterEvent(self, *args, **kwargs):
        pass

Я мог бы сделать печать при наведении «привет», но больше ничего не могу сделать, даже с некоторыми примерами, потому чтоэто с paintEvent и другими типами предметов.

Я хотел бы сохранить тип предмета, если это возможно, и закрасить границу, как я сказал.Но также не знаю, будет ли это лучший подход, который также прост.

1 Ответ

1 голос
/ 23 мая 2019

В QGraphicsItem нет метода paintEvent, но есть метод paint () :

from PyQt5 import QtCore, QtGui, QtWidgets


class PixmapItem(QtWidgets.QGraphicsPixmapItem):
    def __init__(self, pixmap, parent=None):
        super().__init__(pixmap, parent)
        self.setAcceptHoverEvents(True)
        self._is_hovered = False

    def hoverEnterEvent(self, event):
        self._is_hovered = True
        self.update()
        super().hoverEnterEvent(event)

    def hoverLeaveEvent(self, event):
        self._is_hovered = False
        self.update()
        super().hoverLeaveEvent(event)

    def paint(self, painter, option, widget=None):
        super().paint(painter, option, widget)
        if self._is_hovered:
            painter.save()
            pen = QtGui.QPen(QtGui.QColor("black"))
            pen.setWidth(4)
            painter.setPen(pen)
            painter.drawRect(self.boundingRect())
            painter.restore()


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    scene = QtWidgets.QGraphicsScene()
    view = QtWidgets.QGraphicsView(scene)
    item = PixmapItem(QtGui.QPixmap("image.png"))
    scene.addItem(item)
    view.resize(640, 480)
    view.show()
    sys.exit(app.exec_())

Обновление:

def paint(self, painter, option, widget=None):
    super().paint(painter, option, widget)
    if self._is_hovered:
        painter.save()
        pen = QtGui.QPen(QtGui.QColor("black"))
        pen.setWidth(4)
        painter.setPen(pen)
        r = self.boundingRect()
        r.adjust(0, 0, -pen.width()/2, -pen.width()/2)
        painter.drawRect(r)
        painter.restore()
...