2013-10-21 3 views
2
를 찾을 수없는 이유는

당신이 QGraphicsScene 주위에 사각형을 드래그 할 수있는이 매우 간단한 예제를 고려이 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_()) 

(PyQt는을 사용하여, C++ 사용자는 thisself을 읽기) 장면에서 사각형을 클릭했거나 아무 것도 클릭하지 않았다는 인쇄 문구를보아야합니다 (즉, 없음). 이것은 방금 프로그램을 시작하고 사각형을 클릭하면 작동합니다.

이제 왼쪽 상단 모서리에서 사각형을 드래그하고 다시 클릭하십시오. 이번에 itemAt()는 사각형을 클릭하더라도 None을 반환합니다.

무슨 일 이니?

+0

항목의 sceneBoundingRect()가 적절한 값을 반환하는지 확인하십시오. –

+0

Square 인스턴스에서 sceneBoundingRect()를 호출 한 결과 합리적인 결과가 나타납니다. 그러나이 작업을 수행하면 스퀘어의 위치가 (0,0)과 다를 때마다 원래 게시물에 설명 된 오류가 발생한다는 것을 깨달았습니다. 사각형이 장면의 바운딩 바로 바깥에 있기 때문에이 재미있는 비즈니스가 장면을 처리하지 않아도됩니까? 이 장면을 300x300으로 만들었 기 때문에 이것은 놀랄 것입니다 ... – DanielSank

답변

5

대답은 self.itemAt(e.pos()) 대신 self.itemAt(e.scenePos())을 사용해야했기 때문인 것으로 보입니다. 나는 this SO question에서 이것을 발견했습니다.

이 문제에 대한 정보를 찾는 데 어려움을 겪은 이유는 QGraphicsScene에서 QGraphicsItems를 옮기는 것이 이 아니라 Qt가 "끌어다 놓기"라고 부르는 것입니다. 이 주제에 대한 정보를 검색하려면 "move QGraphicsItem"과 같은 항목을 검색하십시오.

관련 문제