В моем быдлоприложении необходимо отображать план помещения и позволять пользователю зумить его и перемещаться. План может храниться как в svg, так и в растре.
В общем-то все работает как надо, за исключением одного момента: при увеличении растровой картинки размером 800x600 в 6.34524 раз, весь элемент становится черным. Общай размер его составляет 5076x3807 точек.
С svg все нормально и при больших зумах/размерах.
Реализация зума.
Для векторной графики (наследник QGraphicsSvgItem):
void SvgImageItem::setZoom(qreal zoom)
{
if (zoom > 0 && zoom != m_zoom)
{
prepareGeometryChange();
m_zoom = zoom;
update(boundingRect());
}
}
QRectF SvgImageItem::boundingRect() const
{
qreal width = renderer()->defaultSize().width() * m_zoom;
qreal height = renderer()->defaultSize().height() * m_zoom;
if (width < 0)
{
width = (renderer()->boundsOnElement(elementId()).size().width());
}
if (height < 0)
{
height = (renderer()->boundsOnElement(elementId()).size().width());
}
return QRectF(0, 0, width, height);
}
Для растровой графики (наследник QGraphicsPixmapItem):
void PixmapImageItem::setZoom(qreal zoom)
{
if (zoom > 0 && zoom != m_zoom)
{
m_zoom = zoom;
this->setPixmap(m_originalPixmap.scaled(m_originalPixmap.width() * m_zoom, m_originalPixmap.height() * m_zoom));
}
}