Skip to main content
 首页 » 编程设计

python之在悬停时绘制 QGraphicsPixmapItem 边框

2024年11月24日31bhlsheji

我正在尝试创建自己的 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 和其他类型的项目有关。

如果可能的话,我想保持项目的类型并按照我说的那样绘制边框。但也不知道这是否是一种更简单的更好方法。

请您参考如下方法:

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()