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

Dan*_*ank 2 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_())
Run Code Online (Sandbox Code Playgroud)

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

现在将方块拖离左上角并再次单击它.即使单击正方形,此时itemAt()也会返回None.

这是怎么回事?

Dan*_*ank 5

答案似乎是我应该用self.itemAt(e.scenePos())而不是self.itemAt(e.pos()).我在这个问题中找到了这个.

我在这里注意到,我在查找有关此问题的信息时遇到的原因是在QGraphicsScene中移动QGraphicsItems 并不是 Qt所谓的"拖放".要搜索有关此主题的信息,您需要搜索"move QGraphicsItem"之类的内容.