我正在尝试创建自己的QGraphicsPixmapItem,可以在悬停模式下激活该控件,并且希望将鼠标悬停在该项目的矩形上时绘制黑色边框,并在离开矩形空间后恢复正常。 / p>
我启动了这段代码,但是不知道下一步该怎么做。也想做一个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
我可以使悬停打印为“ hello”,但即使有一些示例也无法执行其他任何操作,因为这些示例包含paintEvent和其他类型的项目。
如果可能的话,我想保持物品的类型,并按照我所说的那样画边框。但是也不知道这是否是更好的方法,而且也很简单。
答案 0 :(得分:1)
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()