考虑这样一个非常简单的例子,您可以在QGoogleScVIEW中拖动一个正方形(使用PyQt,C++用户读取selfthis

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()即使单击正方形也不返回任何值。
发生什么事?

最佳答案

答案似乎是我应该使用self.itemAt(e.scenePos())而不是self.itemAt(e.pos())。我在this SO question里找到的。
我在这里注意到,我在查找有关此问题的信息时遇到问题的原因是,在qgraphicscene中移动qgraphicscene并不是Qt所说的“拖放”。要搜索有关此主题的信息,您需要搜索“move QGraphicsItem”之类的内容。

关于python - 为什么itemAt()不能总是找到QGraphicsItem,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19486478/

10-09 05:58