为什么itemAt()并不总能找到QGraphicsItem

时间:2013-10-21 04:50:45

标签: python qt pyqt pyqt4

考虑这个非常简单的示例,您可以在QGraphicsScene周围拖动一个方块(使用PyQt,C ++用户将self读为this

import sys
from PyQt4 import QtGui, QtCore

class MainWindowUi(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.scene = Scene(0, 0, 300, 300, self)
        self.view = QtGui.QGraphicsView()
        self.setCentralWidget(self.view)
        self.view.setScene(self.scene)
        self.scene.addItem(Square(0,0,50,50))

class Scene(QtGui.QGraphicsScene):

    def mousePressEvent(self, e):
        self.currentItem = self.itemAt(e.pos())
        print (self.currentItem)
        QtGui.QGraphicsScene.mousePressEvent(self, e)

class Square(QtGui.QGraphicsRectItem):
    def __init__(self, *args):
        QtGui.QGraphicsRectItem.__init__(self, *args)
        self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True)
        self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    win = MainWindowUi()
    win.show()
    sys.exit(app.exec_())

当您在场景中单击鼠标时,您应该看到一个打印声明,告诉您单击了正方形或没有任何东西(即无)。如果您只是启动程序并单击正方形,则此方法有效。

现在将广场从左上角拖出并再次点击它。即使单击正方形,此时itemAt()也会返回无。

发生了什么事?

1 个答案:

答案 0 :(得分:5)

答案似乎是我应该使用self.itemAt(e.scenePos())代替self.itemAt(e.pos())。我在this SO question找到了这个。

我在这里注意到,我一直无法找到有关此问题的信息的原因是在QGraphicsScene中移动QGraphicsItems是而不是 Qt称之为“拖放”。要搜索有关此主题的信息,您需要搜索“移动QGraphicsItem”等内容。