2013-10-21 55 views
2

考慮這個非常簡單的例子,你可以拖動一個QGraphicsScene方(使用PyQt的,C++用戶閱讀selfthis爲什麼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,即使你點擊了正方形。

發生了什麼事?

+0

檢查該項目上的sceneBoundingRect()是否返回合理的值 –

+0

在Square實例上調用sceneBoundingRect()的結果會產生明智的結果。但是,這樣做的時候我意識到,只要Square的位置與(0,0)不同,就會發生原始帖子中描述的失敗。這是不是有趣的事情與場景沒有得到廣場,因爲廣場是在場景的邊界之外?這會讓我感到意外,因爲我將場景設置爲300x300 ... – DanielSank

回答

5

答案似乎是我應該使用self.itemAt(e.scenePos())而不是self.itemAt(e.pos())。我在this SO question發現了這個。

我在這裏指出,我一直無法找到關於此問題的信息的原因是,在一個QGraphicsScene走動QGraphicsItems是什麼Qt的所謂的「拖放」。要搜索關於此主題的信息,您需要搜索諸如「移動QGraphicsItem」之類的內容。

相關問題