2

多くの長方形(アイテム)が配置されたQGraphicView内にGraphicSceneがあります。各長方形がマウスクリックに応答するようにしたいのですが、イベントハンドラーを正しいオブジェクトにアタッチし、イベントをオブジェクトに伝播するためのフックを見つけることができません。

シーンにイベントハンドラーをアタッチしました。

scene.event = myfunction

そしてそれは機能しました(それはすべてのイベントを起動していました)が、私はその子の1つに同じ関数をアタッチすることができませんでした。そのようなエントリポイントをどこで検索するかについての洞察を教えてください。

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 に答える