[solved] Moving and Resizing QGraphicsSvgItem with PyQt4



  • It makes a few days that I've started to play with Python3 and PyQt4.
    I thought that it could be nice to make a simple card game. I've read some tutorials, searched on PyQt4, Qt4, Qt5 and PyQt5 documentation but I got stacked!
    But now I'm starting to have some problems: how to resize my Items so they have a relational size with the scene.sceneRect() (cardHeight = sceneRect().height()/10) and how should implement independent movement to those items (separate time of movement start and target).
    I have a big file already written but here is a sample example where I would like to implement those features (if you help me).
    @from PyQt4 import QtCore, QtGui, QtSvg

    class GameView(QtGui.QGraphicsView):

    """Widget where we will see the results.
    the file used may be found at https://github.com/sandsmark/poker-ai/blob/master/card-deck/oxygen-air.svgz
    """
    def __init__(self, filename = "../pictures/oxygen-air.svgz", parent = None):
        
        """Initialize the Viewer."""
        
        super(GameView, self).__init__(parent)
        
        carddeck = QtSvg.QSvgRenderer(filename)
        myCards={}
        
        for someId in ("back", "1_spade", "queen_diamond"):
            
            newCard = QtSvg.QGraphicsSvgItem()
            newCard.setSharedRenderer(carddeck)
            newCard.setElementId(someId)
            
            myCards[someId] = newCard
            
        self.scene = QtGui.QGraphicsScene()
        # Set screen resolution in case it's shown on fullscreen mode
        self.scene.setSceneRect(
            QtCore.QRectF(QtGui.QDesktopWidget().screenGeometry()))
        self.setScene(self.scene)
        
        tempPos = 0, 0
        
        for cardId in myCards.keys():
            
            self.scene.addItem(myCards[cardId])
            
            myCards[cardId].setPos(QtCore.QPointF(tempPos[0], tempPos[1]))
            
            tempPos = tempPos[0] + myCards[cardId].boundingRect().width(),
                    tempPos[1] + myCards[cardId].boundingRect().height()
            
    def resizeEvent(self, event):
        
        """Only to make sure that qgraphics view have no scroolbars."""
        
        self.fitInView(self.scene.sceneRect(), QtCore.Qt.KeepAspectRatio)
    

    if name == "main":

    import sys
    
    app = QtGui.QApplication(sys.argv)
    widget = GameView()
    widget.show()
    sys.exit(app.exec_())
    @


  • Think I've the answer to one part: Resizing.
    Here I'll leave my first approach.

    @def resize(svgItem, maxSizeRectF):

    """Resize an svgItem till fit on maxSizeRectF rectangle."""
    
    # Get the smaller side of the rect
    relativeSize = min( maxSizeRectF.width(),maxSizeRectF.height() )
    
    #Scale the item
    svgItem.setScale(relativeSize/svgItem.boundingRect().height())
    

    @

    Now here came the part I haven't used before!
    When we need to know the measures of this Svg Item, we have to be carefull!

    svgItem."boundingRect()":http://pyqt.sourceforge.net/Docs/PyQt4/qgraphicsitem.html#boundingRect - will return the svgItem's (own) bounding Rect
    we may need to use svgItem."sceneBoundingRect()":http://pyqt.sourceforge.net/Docs/PyQt4/qgraphicsitem.html#sceneBoundingRect to get the bounding rect of this Item on the scene.
    If I'm wrong please correct me.
    Now it's time to find my second part of the problem... movement!



  • And think I got him! Is something like this:

    @def moveCard(self, card, targetPoint, timeLine = 5000, rotation = 0):

    """Move the card from one position to one other."""
    
    cardTimer=QtCore.QTimeLine(timeLine)
    
    cardAnimation=QtGui.QGraphicsItemAnimation(self)
    cardAnimation.setItem(card)
    cardAnimation.setTimeLine(cardTimer)
    
    cardAnimation.setPosAt(1, targetPoint)
    cardAnimation.setRotationAt(1, rotation)
    
    cardTimer.start()@
    

    ... improve speed with svg card items?


    Edited:
    I've noted improved speed adding @card.setCacheMode(QtGui.QGraphicsItem.NoCache)@


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.