QGraphicsItemGroup

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
HerrJeh
User
Beiträge: 2
Registriert: Sonntag 3. Februar 2013, 13:10

Hallo,
seit ca. einem halben Jahr beschäftige ich mich mit Python. Ich bin dabei, eine Anwendung mit Qt Gui zu erstellen, in der ein
Graph aufgebaut werde soll. Es werden ItemGroups verwendet. Hier habe ich ein Problem.
Die Group wird korrekt dargestellt und lässt sich verschieben. Wenn ich die Group erneut mit der Maus verschieben möchte, "springt" diese zunächst
an eine andere Position. Hat jemant eine Idee warum das geschieht?


Hier noch der Code:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import uuid
#from const import values
from PyQt4 import QtGui, QtCore
#from mainwindow import  Ui_MainWindow as Dlg

view=None

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s


class Graphnode(QtGui.QGraphicsItemGroup):

    def __init__(self, pos, graphWidget):
        super(Graphnode, self).__init__()
        
        self.setFlags(QtGui.QGraphicsItem.ItemIsSelectable|
                      QtGui.QGraphicsItem.ItemIsMovable |
                      QtGui.QGraphicsItem.ItemIsFocusable)
        
        self.setSelected(False)
        self.setVisible(True)
        
        self.graphWidget=graphWidget
        self.rect=self.boundingRect()

        self.setPos(pos)
       
        self.textfield=QtGui.QGraphicsTextItem("Text eingeben")
        self.textfield.setPos(0,0)
        
       
        self.textrec= self.textfield.boundingRect()
        
        self.recBox=QtCore.QRectF(0, 0, self.textrec.width(), self.textrec.height())
       
        self.box=QtGui.QGraphicsRectItem()
        self.box.setRect(self.recBox)
        self.box.style = QtCore.Qt.SolidLine
        
        self.addToGroup(self.textfield)
        self.addToGroup(self.box)
        

    
    def mouseReleaseEvent(self, event):
        self.setSelected(False)
        self.clearFocus()
        
        
    
    def mousePressEvent(self, event):
        self.setSelected(True)
        self.setFocus()
        

    def mouseDoubleClickEvent(self, event):
        textrec=self.textfield.boundingRect()
        self.graphWidget.nodedoublicked(self)
        textrec=self.textfield.boundingRect()
        self.setnewboxsize()
   
    
    def setnewboxsize(self):
        textrec=self.textfield.boundingRect()
        self.box.setRect(textrec)
    
    
class GraphWidget(QtGui.QGraphicsView):
    def __init__(self):
        super(GraphWidget, self).__init__()
        
        self.timerId = 0

        self.scene = QtGui.QGraphicsScene(self)
        self.scene.setSceneRect(-200, -200, 800, 600)
        self.setScene(self.scene)
        self.setRenderHint(QtGui.QPainter.Antialiasing)

    
    def nodedoublicked(self, node):
        node.textfield.setPlainText("kkk\njjj")
        
        
    def addnode(self):
        node=Graphnode(QtCore.QPointF(60, 80), self)
        self.scene.addItem(node)

    
class MainWindow(QtGui.QMainWindow):

    wscene=None
    wview=None
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        
        self.prevPoint = QtCore.QPoint()
        self.resize(800, 600)
        self.setWindowTitle("Desinger")
        self.createMenuBar()
        
        self.graphwidget = GraphWidget()
        self.graphwidget.show()
        
        widged= QtGui.QWidget()       
        layout = QtGui.QVBoxLayout()
        
        layout.addWidget(self.graphwidget)
        widged.setLayout(layout)
        self.setCentralWidget(widged)
  

    def createMenuBar(self):

        exitAction = QtGui.QAction(QtGui.QIcon('exit.png'), 'exit', self)  
        exitAction.setShortcut('Ctrl+Q')
        exitAction.triggered.connect(QtGui.qApp.quit)

        newAction = QtGui.QAction(QtGui.QIcon('exit.png'), 'new', self)  
        newAction.setShortcut('Ctrl+N')
        newAction.triggered.connect(self.menuenewGraph)

        openAction = QtGui.QAction(QtGui.QIcon('exit.png'), _fromUtf8('open'), self)  
        openAction.setShortcut('Ctrl+O')
        openAction.triggered.connect(self.menueopenGraph)
  
        addRect = QtGui.QAction(QtGui.QIcon('exit.png'), _fromUtf8('Aktion'), self)  
        addRect.setShortcut('Ctrl+A')
        addRect.setStatusTip('Aktion einfügen') 
        addRect.triggered.connect(self.menueAddRect)
        fileMenu = QtGui.QMenuBar()
        
     
        fileMenuProg = QtGui.QMenu("&Programm", self)
        fileMenuProg.addAction(newAction)
        fileMenuProg.addAction(openAction)
        fileMenuProg.addAction(exitAction)
        fileMenu.addMenu(fileMenuProg)
        
        fileMenu.addAction(addRect)
        self.setMenuBar(fileMenu)
    
   
    
    def menueAddRect(self):
        self.graphwidget.addnode()

    
    def menuenewGraph(self):
        pass
        
    def menueopenGraph(self):
        pass



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

Zuletzt geändert von Anonymous am Sonntag 3. Februar 2013, 14:20, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
HerrJeh
User
Beiträge: 2
Registriert: Sonntag 3. Februar 2013, 13:10

Hallo,
ich habe den Code im Bereich der Menüerstellung angepasst. Die Darstellung war fehlerhaft.
Folgender Hinweis zur Bedienung:
- Über Menü Aktion wird eine GraphicsGroup in der Graphicscene erstellt.
- Mit der Maus kann die Group verschoben werden.
- Verschiebt man die Group ein zweites mal, springt diese unter der Maus an eine andere Positon

Mitlerweile habe ich durch probieren eine Lösung gefunden.
Am Ende des MouseRelease und Mousepress Events habe ich folgende Einträge ergänzt:

Code: Alles auswählen

QtGui.QGraphicsItem.mouseReleaseEvent(self, event)
#bzw.
QtGui.QGraphicsItem.mousePressEvent(self, event)
Warum das allerdings funktioniert habe ich bisher noch nicht verstanden.
Hat jeman von Euch vielleicht eine Erklärung?
BlackJack

@HerrJeh: Naja Du überschreibst da zwei Methoden von `QGraphicsItem`. Deine werden statt denen aufgerufen, aber die *tun* ja etwas. Wenn sie das weiterhin tun sollen, musst Du sie natürlich aufrufen, damit sie ihren Job erledigen können. Ich würde ja noch den Rückgabewert von den Methoden in Deinen zurück geben. Es sei denn Du bist sicher dass das bei Dir immer ein „Falsch”-Wert sein soll, auch wenn die Methoden auf `QgraphicsIcon` einen „Wahr”-Wert zurückgeben sollten.
Antworten