2012-06-16 34 views
1

我正在編寫一個應用程序,允許用戶通過單擊空白區域將圖像放置在QGraphicsScene(包含在QGraphicsView中),然後使用mousemoveevent移動它們。圖像是使用子類QGraphicsPixmapItem創建的。PySide移動QGraphicsPixmapItem跳轉到場景的左上角

問題出在這裏:移動項目的第一次嘗試按預期工作。但是,對於隨後的所有移動,所選項目立即跳轉到場景的左上角。這裏是代碼:

import sys 
from PySide import QtGui,QtCore 

class TestPixmapItem(QtGui.QGraphicsPixmapItem): 
    def __init__(self, imagename, position, parent=None): 
     QtGui.QGraphicsPixmapItem.__init__(self, parent) 

     px = QtGui.QPixmap(imagename) 
     self.setPixmap(px) 

     self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True) 
     self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True) 

     # set position 
     self.setPos(position.x(),position.y()) 

    def mouseReleaseEvent(self,e): 
     self.setSelected(False) 

    def mouseMoveEvent(self, e): 
     QtGui.QGraphicsPixmapItem.mouseMoveEvent(self, e) 


class GfxScene(QtGui.QGraphicsScene): 
    def __init__(self, parent=None): 
     #build parent user interface 
     super(GfxScene, self).__init__(parent) 

    def mousePressEvent(self, e): 
     if(self.itemAt(e.scenePos().x(),e.scenePos().y()) == None): 
      pixmapItem = TestPixmapItem('test.png',e.scenePos()) 
      self.addItem(pixmapItem) 
     else: 
      QtGui.QGraphicsScene.mousePressEvent(self,e); 


class MainForm(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainForm, self).__init__(parent) 

     scene = GfxScene(self) 
     scene.setSceneRect(QtCore.QRect(0, 0, 800, 800)) 

     view = QtGui.QGraphicsView() 
     view.setScene(scene) 
     view.setSceneRect(scene.sceneRect()) 
     #view.setGeometry(QtCore.QRect(0, 0, 800, 800)) 
     self.setCentralWidget(view) 


def main(): 
    #This function means this was run directly, not called from another python file. 
    app = QtGui.QApplication.instance() 
    if app == None: 
      app = QtGui.QApplication(sys.argv) 
    myapp = MainForm() 
    myapp.show() 

    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

任何幫助,將不勝感激!

回答

3

你應該叫QtGui.QGraphicsPixmapItem.mouseReleaseEvent(個體經營,E)當您覆蓋鼠標釋放事件,請參閱:http://goo.gl/ChSYP

import sys 
from PySide import QtGui,QtCore 

class TestPixmapItem(QtGui.QGraphicsPixmapItem): 
    def __init__(self, imagename, position, parent=None): 
     QtGui.QGraphicsPixmapItem.__init__(self, parent) 

    px = QtGui.QPixmap(imagename) 
    self.setPixmap(px) 

    self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True) 
    self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True) 

    # set position 
    self.setPos(position.x(),position.y()) 

def mouseReleaseEvent(self,e): 
    self.setSelected(False) 
    QtGui.QGraphicsPixmapItem.mouseReleaseEvent(self, e) // here calling the event 

def mouseMoveEvent(self, e): 
    QtGui.QGraphicsPixmapItem.mouseMoveEvent(self, e) 


class GfxScene(QtGui.QGraphicsScene): 
    def __init__(self, parent=None): 
     #build parent user interface 
     super(GfxScene, self).__init__(parent) 

def mousePressEvent(self, e): 
    if(self.itemAt(e.scenePos().x(),e.scenePos().y()) == None): 
     pixmapItem = TestPixmapItem('test.png',e.scenePos()) 
     self.addItem(pixmapItem) 
    else: 
     QtGui.QGraphicsScene.mousePressEvent(self,e); 


class MainForm(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainForm, self).__init__(parent) 

    scene = GfxScene(self) 
    scene.setSceneRect(QtCore.QRect(0, 0, 800, 800)) 

    view = QtGui.QGraphicsView() 
    view.setScene(scene) 
    view.setSceneRect(scene.sceneRect()) 
    #view.setGeometry(QtCore.QRect(0, 0, 800, 800)) 
    self.setCentralWidget(view) 


def main(): 
    #This function means this was run directly, not called from another python file. 
    app = QtGui.QApplication.instance() 
    if app == None: 
     app = QtGui.QApplication(sys.argv) 
    myapp = MainForm() 
    myapp.show() 

sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 
+0

謝謝feelingtheblanks - 完美地工作! – jsaugustyn

+0

不客氣,你也可以標記答案是正確的,而不是重新授權的問題解決:) – NotCamelCase

+0

感謝您的提示 - 我顯然是一個新手! – jsaugustyn

相關問題