Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt PySide移动QGraphicsPixmapItem跳到场景的左上角_Qt_Pyqt_Pyside_Qgraphicsview_Qgraphicsscene - Fatal编程技术网

Qt PySide移动QGraphicsPixmapItem跳到场景的左上角

Qt PySide移动QGraphicsPixmapItem跳到场景的左上角,qt,pyqt,pyside,qgraphicsview,qgraphicsscene,Qt,Pyqt,Pyside,Qgraphicsview,Qgraphicsscene,我正在编写一个应用程序,允许用户通过单击空白区域,然后使用mousemoveevent将图像移动到QGraphicsView中包含的QGraphicsCenter上。这些图像是使用子类QGraphicsPixmapItem创建的 问题是:第一次尝试移动项目时,效果与预期一致。但是,对于所有后续移动,选定项目会立即跳到场景的左上角。代码如下: import sys from PySide import QtGui,QtCore class TestPixmapItem(QtGui.QGraphi

我正在编写一个应用程序,允许用户通过单击空白区域,然后使用mousemoveevent将图像移动到QGraphicsView中包含的QGraphicsCenter上。这些图像是使用子类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() 

任何帮助都将不胜感激

重写鼠标释放事件时,应调用QtGui.QGraphicsPixmapItem.mouseReleaseEventself,请参见:


重写鼠标释放事件时,应调用QtGui.QGraphicsPixmapItem.mousereleaseventself,请参阅:


不客气,你也可以将答案标记为正确,而不是将问题列为已解决:谢谢你的提示-我显然是个新手!不客气,你也可以将答案标记为正确,而不是将问题列为已解决:谢谢你的提示-我显然是个新手!
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()