带有 Svg 图像的 pyQt 悬停事件

Posted

技术标签:

【中文标题】带有 Svg 图像的 pyQt 悬停事件【英文标题】:pyQt Hover event with Svg image 【发布时间】:2011-11-04 01:42:38 【问题描述】:

我已经为此工作了一段时间,但我无法弄清楚我做错了什么。我希望这里有人可以提供帮助。

当我将鼠标悬停在 QGraphicsScene 中的 Svg 项目上时,我试图让悬停事件起作用。这是我一直在玩的代码。

#!/usr/bin/python

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.QtSvg import *

class Main(QWidget):

    def __init__(self):
        super(Main, self).__init__()

        hbox = QHBoxLayout()

        self.setLayout(hbox)
        self.view = MyView(self)
        self.scene = QGraphicsScene()
        self.view.setScene(self.scene)

        hbox.addWidget(self.view)


class MyView(QGraphicsView):

    def __init__(self, parent):
        super(MyView, self).__init__(parent)
        self.parent = parent

    def mousePressEvent(self, event):
        super(MyView, self).mousePressEvent(event)
        test = MySvg()
        self.parent.scene.addItem(test.image)


class MySvg(QGraphicsSvgItem):

    def __init__(self):
        super(MySvg, self).__init__()

        self.image = QGraphicsSvgItem('ubuntu.svg')
        self.image.setFlags(QGraphicsItem.ItemIsSelectable|
                            QGraphicsItem.ItemIsMovable)

        self.setAcceptsHoverEvents(True)

    def hoverEnterEvent(self, event):
        print 'Enter'

    def hoverLeaveEvent(self, event):
        print 'Leave'

    def hoverMoveEvent(self, event):
        print 'Moving'


def runMain():

    app = QApplication(sys.argv)
    ex = Main()
    ex.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    runMain()

希望有人能提供帮助。

【问题讨论】:

【参考方案1】:

您正在监视 MySvg 的悬停事件,但您正在将另一个 QGraphicsSvgItem 添加到只是 MySvg 中的一个实例 (MySvg.image) 的视图中。您的MySvg 甚至不在视图中。试试这样:

#!/usr/bin/python

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.QtSvg import *

class Main(QWidget):

    def __init__(self):
        super(Main, self).__init__()

        hbox = QHBoxLayout()

        self.setLayout(hbox)
        self.view = MyView(self)
        self.scene = QGraphicsScene()
        self.view.setScene(self.scene)

        hbox.addWidget(self.view)


class MyView(QGraphicsView):

    def __init__(self, parent):
        super(MyView, self).__init__(parent)
        self.parent = parent

    def mousePressEvent(self, event):
        super(MyView, self).mousePressEvent(event)
        test = MySvg()
        self.parent.scene.addItem(test)


class MySvg(QGraphicsSvgItem):

    def __init__(self):
        super(MySvg, self).__init__('ubuntu.svg')

        self.setFlags(QGraphicsItem.ItemIsSelectable|
                      QGraphicsItem.ItemIsMovable)

        self.setAcceptsHoverEvents(True)

    def hoverEnterEvent(self, event):
        print 'Enter'

    def hoverLeaveEvent(self, event):
        print 'Leave'

    def hoverMoveEvent(self, event):
        print 'Moving'


def runMain():

    app = QApplication(sys.argv)
    ex = Main()
    ex.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    runMain()

【讨论】:

非常感谢这个。这解决了更多问题。

以上是关于带有 Svg 图像的 pyQt 悬停事件的主要内容,如果未能解决你的问题,请参考以下文章

悬停时动画 SVG 图像蒙版

带有多个元素的 SVG 悬停

将鼠标悬停在图像上时如何更改 SVG 的颜色?

无法将 SVG 图像和文本悬停在 div 内 [重复]

CSS:悬停在 SVG 组区域而不是渲染像素上,指针事件:边界框不能跨浏览器工作。如何解决

悬停时更改 SVG 填充和文本突出显示颜色