Projet

Général

Profil

Redimensionner un QGraphicsSvgItem

Il semble qu'il y ait un problème pour redimensionner les QGraphicsSvgItem (en tout cas avec Qt 4.8.x)
Une solution inspirée de http://www.qtcentre.org/archive/index.php/t-9188.html passe par une dérivation de cette classe.

Implémentation

Déclaration des fonctions surchargées (.h)

class AbulEduGraphicsSVGItem :public QGraphicsSvgItem
{
    Q_OBJECT
public:
    explicit AbulEduGraphicsSVGItem(const QString & filename, QGraphicsItem *parentItem = 0);
    ...
    void setSize(QSizeF size);
    QSizeF size();
private:
    ...
    QSizeF m_size;
protected:
    ...
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);

signals:

public slots:
    QRectF boundingRect();

};

Dans ce bout de code, je n'ai laissé que ce qu'il faut ajouter.

Dans le .cpp, il faut faire :
Dans le constructeur, ajouter :

    QSvgRenderer *renderer = new QSvgRenderer(filename);
    setSharedRenderer(renderer);

Puis définir les fonctions setSize(QSizeF size) et size()

void AbulEduGraphicsSVGItem::setSize(QSizeF size)
{
    if (m_size != size)
    {
        prepareGeometryChange();
        m_size = size;
        update(boundingRect());
    }
}

QSizeF AbulEduGraphicsSVGItem::size()
{
    qreal width = m_size.width();
    qreal height = m_size.height();

    if (m_size.width() < 0)
    {
        width = (renderer()->boundsOnElement(elementId()).size().width());
    }

    if (m_size.height() < 0) {
        height = (renderer()->boundsOnElement(elementId()).size().width());
    }

    return QSizeF(width, height);
}

On redéfinit aussi boundingRect()

QRectF AbulEduGraphicsSVGItem::boundingRect()
{
    return QRectF(QPointF(0.0, 0.0), size());
}

Puis, même punition pour paint(...):

void AbulEduGraphicsSVGItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(widget);
    Q_UNUSED(option);
    if (!renderer()->isValid())
    {
        return;
    }

    if (elementId().isEmpty())
    {
        renderer()->render(painter, boundingRect());
    }
    else
    {
        renderer()->render(painter, elementId(), boundingRect());
    }
}

Utilisation

On utilise tout simplement la fonction setSize(QSize) sur un AbulEduGraphicsSVGItem

    m_svgItem->setSize(QSize(20.0, 20,0));
Redmine Appliance - Powered by TurnKey Linux