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));