Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么itemAt()不总是找到QGraphicsItem 考虑这个非常简单的例子,你可以在QGoogleScS场景中拖动一个正方形(使用PyQt、C++用户读自己 > < >_Python_Qt_Pyqt_Pyqt4 - Fatal编程技术网

Python 为什么itemAt()不总是找到QGraphicsItem 考虑这个非常简单的例子,你可以在QGoogleScS场景中拖动一个正方形(使用PyQt、C++用户读自己 > < >

Python 为什么itemAt()不总是找到QGraphicsItem 考虑这个非常简单的例子,你可以在QGoogleScS场景中拖动一个正方形(使用PyQt、C++用户读自己 > < >,python,qt,pyqt,pyqt4,Python,Qt,Pyqt,Pyqt4,当您在场景中单击鼠标时,您应该会看到一条打印语句,告诉您您单击了正方形或没有(即无)。如果你只需启动程序并点击方块,这个功能就可以实现 现在从左上角拖动正方形,然后再次单击它。这一次,itemAt()即使单击正方形也不返回任何值 怎么回事?答案似乎是我应该使用self.itemAt(e.scenePos())而不是self.itemAt(e.pos())。这是我在家里找到的 我在这里注意到,我一直难以找到关于这个问题的信息的原因是,在QGraphicscene中移动QGraphicsSitems

当您在场景中单击鼠标时,您应该会看到一条打印语句,告诉您您单击了正方形或没有(即无)。如果你只需启动程序并点击方块,这个功能就可以实现

现在从左上角拖动正方形,然后再次单击它。这一次,itemAt()即使单击正方形也不返回任何值


怎么回事?

答案似乎是我应该使用
self.itemAt(e.scenePos())
而不是
self.itemAt(e.pos())
。这是我在家里找到的


我在这里注意到,我一直难以找到关于这个问题的信息的原因是,在QGraphicscene中移动QGraphicsSitems并不是Qt所说的“拖放”。要搜索有关此主题的信息,您需要搜索诸如“move QGraphicsItem”之类的内容。

检查项上的SceneBondingDirect()是否返回合理的值对Square实例调用SceneBondingDirect()的结果会产生合理的结果。然而,在这样做的时候,我意识到当正方形的位置与(0,0)不同时,就会发生我原来文章中描述的失败。这是不是有些有趣的事情,因为正方形在场景的边界矩形之外,所以场景没有得到正方形?这会让我感到惊讶,因为我制作了300x300的场景。。。
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_())