2
考慮這個非常簡單的例子,你可以拖動一個QGraphicsScene方(使用PyQt的,C++用戶閱讀self
爲this
)爲什麼itemAt()不是總能發現的QGraphicsItem
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()返回None,即使你點擊了正方形。
發生了什麼事?
檢查該項目上的sceneBoundingRect()是否返回合理的值 –
在Square實例上調用sceneBoundingRect()的結果會產生明智的結果。但是,這樣做的時候我意識到,只要Square的位置與(0,0)不同,就會發生原始帖子中描述的失敗。這是不是有趣的事情與場景沒有得到廣場,因爲廣場是在場景的邊界之外?這會讓我感到意外,因爲我將場景設置爲300x300 ... – DanielSank