2012-06-16 2 views
1

Я пишу приложение, которое позволяет пользователю размещать изображения на QGraphicsScene (содержащиеся в QGraphicsView), нажимая на пустую область и затем перемещая их с использованием mousemoveevent. Изображения создаются с использованием подкласса QGraphicsPixmapItem.PySide moving 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 (я, е), когда вы переопределить событие отпускания мыши, см: 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

Добро пожаловать, вы также можете отметить ответ как правильный, а не повторять вопрос как SOLVED :) – NotCamelCase

+0

Спасибо за подсказку - я, очевидно, новичок! – jsaugustyn

Смежные вопросы