2

我在填充有许多矩形(项目)的 QGraphicView 中有一个 GraphicScene。我希望每个矩形都响应鼠标单击,但我无法找到将事件处理程序附加到正确对象并将事件传播给它的钩子。

我在场景中附加了一个事件处理程序:

scene.event = myfunction

它起作用了(它触发了每个事件),但我无法将相同的功能附加到它的一个孩子身上。你能给我一个关于在哪里搜索这样一个入口点的见解吗?

4

2 回答 2

3

所以 - 我不太确定你在那里做什么,但我想不出 PyQt 中有任何东西应该将自定义函数直接映射到场景的事件方法。

你有一个实际的例子吗?

如果你正在做:

scene.mousePressEvent = my_mouse_function

那么这不是你想要的方式。

您可以查看使用事件过滤器 (http://doc.qt.nokia.com/4.7-snapshot/eventsandfilters.html#event-filters)。

获得所需内容的最佳方法是将 QGraphicsItem 子类化(无论您使用的是 QGraphicsRectItem、QGraphicsPathItem 等)并在其上重载 mousePressEvent 方法。

http://doc.qt.nokia.com/4.7-snapshot/qgraphicsitem.html#mousePressEvent

例如:

from PyQt4.QtGui import QGraphicsRectItem

class MyItem(QGraphicsRectItem):
    def mousePressEvent(self, event):
        super(MyItem, self).mousePressEvent(event)
        print 'overloaded'

scene.addItem(MyItem())
于 2012-08-28T17:17:53.187 回答
2

子类化视图、场景、项目等并重新实现mousePressEvent和/或mouseReleaseEvent;或在这些项目上安装事件过滤器。

有关在场景中使用事件过滤器的示例,请参阅此答案

这是一个重新实现mouseReleaseEvent视图的演示:

from PyQt4 import QtGui, QtCore

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.view = View(self)
        self.label = QtGui.QLabel(self)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.view)
        layout.addWidget(self.label)

class View(QtGui.QGraphicsView):
    def __init__(self, parent):
        QtGui.QGraphicsView.__init__(self, parent)
        self.setScene(QtGui.QGraphicsScene(self))
        for index, name in enumerate('One Two Three Four Five'.split()):
            item = QtGui.QGraphicsRectItem(
                index * 60, index * 60, 50, 50)
            item.setData(0, name)
            self.scene().addItem(item)

    def mouseReleaseEvent(self, event):
        pos = event.pos()
        item = self.itemAt(pos)
        if item is not None:
            text = 'Rectangle <b>%s</b>' % item.data(0).toString()
        else:
            text = 'No Rectangle (%d, %d)' % (pos.x(), pos.y())
        self.parent().label.setText(text)
        QtGui.QGraphicsView.mouseReleaseEvent(self, event)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.resize(400, 400)
    window.show()
    sys.exit(app.exec_())
于 2012-08-28T17:13:51.827 回答