2016-08-03 29 views
0

Ich versuche, ein SVG-Bild in, was schließlich eine QGroupBox in einer anderen Anwendung sein wird. Beim ersten Klick auf das SVG "klebt" das SVG dann an der Maus (als ob die Maustaste während eines Drag & Drop gedrückt gehalten würde). Ein zweiter Klick löst das Bild.PySide: Soll ein SVG-Bild der Maus ohne Drag & Drop folgen?

Ich habe gelesen, aber nicht ganz verstehen, die Art von/Beziehung zwischen Widgets, Elemente, Szenen und Ansichten. Mein Code unten funktioniert irgendwie, ist aber nicht ganz richtig. Das Bild vermeidet fast aktiv die Maus. Gibt es irgendwo eine klare Erklärung für Nicht-C-, Nicht-C++ - Anfänger mit PyQt/PySide? Oder gibt es eine einfache Erklärung dafür, wo ich falsch gelaufen bin?

#!/usr/bin/env python2 
# -*- coding: utf-8 -*- 

import sys 
from PySide.QtCore import * 
from PySide.QtGui import * 
from PySide.QtSvg import * 


class Image(QGraphicsSvgItem): 

    def __init__(self, parent=None): 
     super(Image, self).__init__("image.svg", parent) 
     self.parent = parent 

     self.setFlags(QGraphicsItem.ItemIsSelectable | 
         QGraphicsItem.ItemIsMovable) 

     self.setAcceptsHoverEvents(True) 

     self.svgSize = self.renderer().defaultSize() 
     self.width = self.svgSize.width() 
     self.height = self.svgSize.height() 
     self.absolute = None # Image's absolute (global) position 
     self.mobile = 0  # Initially immobile 
     self.scene = None # Not in a scene yet 
     self.view  = None # Not in a view yet 

    def hoverEnterEvent(self, event): 
     print "Enter" 

    def hoverLeaveEvent(self, event): 
     print "Leave" 

    def hoverMoveEvent(self, event): 
     print "Moving" 
     self.absolute = QCursor.pos() 
     if self.view: 
      relative = self.view.mapFromGlobal(self.absolute) 
      if self.mobile: 
#    self.setPos(relative) 
       self.setPos(self.absolute) 


class Viewport(QGraphicsView): 

    def __init__(self, parent=None): 
     super(Viewport, self).__init__(parent) 
     self.scene = QGraphicsScene() 
     self.image = Image() 
     self.image.setPos(100, 100) 
     self.scene.addItem(self.image) 
     self.setScene(self.scene) 
     self.image.scene = self.scene 
     self.image.view = self 

    def mousePressEvent(self, event): 
     super(Viewport, self).mousePressEvent(event) 

     self.image.mobile = (self.image.mobile + 1) % 2 # Toggle mobility 

     x = self.image.x() # + int(self.image.width/2) 
     y = self.image.y() # + int(self.image.height/2) 
     QCursor.setPos(x, y) 

     relative = self.mapFromGlobal(self.image.absolute) 

     print "absolute.x() = {0} absolute.y() = {1}"\ 
       .format(self.image.absolute.x(), self.image.absolute.y()) 

     print "relative.x() = {0} relative.y() = {1}"\ 
       .format(relative.x(), relative.y()) 


class MainWindow(QWidget): 

    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 

     self.view = Viewport(self) 

     hbox = QHBoxLayout() 
     hbox.addWidget(self.view) 

     self.setLayout(hbox) 


app = QApplication(sys.argv) 
window = MainWindow() 
window.show() 
sys.exit(app.exec_()) 

Antwort

0

Jukka auf der pyside Mailingliste konnte mich mit der folgenden Reaktion helfen:

Sie müssen Sie wechseln nicht alles tun, in QGraphicsView, mousePressEvent in Image haben kann ein- und ausschalten. Diese Ereignisse erhalten QGraphicsMouseEvents als Parameter und diese haben die Informationen, die Sie über die Position des Cursors oder die Maus drücken müssen. Also, in kurz, entfernen mousePressEvent von Viewport und ersetzen hoverMoveEvent in Ihrem Image mit diesem und es wird funktionieren:

def hoverMoveEvent(self, event): 
    if self.mobile: 
     print("Moving") 
     self.setPos(event.scenePos() - QPoint(self.width/2, self.height/2)) 

def mousePressEvent(self, event): 
    self.mobile = not self.mobile # Toggle mobility 
    super().mousePressEvent(event)