LINUX.ORG.RU

QGraphicsPixmapItem vs QGraphicsSvgItem

 , , ,


0

1

В моем быдлоприложении необходимо отображать план помещения и позволять пользователю зумить его и перемещаться. План может храниться как в 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));
    }
}



Последнее исправление: Fredrik (всего исправлений: 2)

Оно у тебя случаем не через OpenGL выводится? Там есть лимит на размер текстур.

Amp ★★★
()
Ответ на: комментарий от Amp

Оно у тебя случаем не через OpenGL выводится? Там есть лимит на размер текстур.

Точно так! Без OpenGL все гут.
Не в курсе, можно ли этот лимит программно изменить?

Fredrik
() автор топика
Последнее исправление: Fredrik (всего исправлений: 1)
Ответ на: комментарий от Fredrik

Не в курсе, можно ли этот лимит программно изменить?

Никак, это ограничение на уровне видеокарт или драйверов к ним. И может варьироваться в широких пределах в зависимости от новизны видеокарты. Как вариант - разбивай картинку на части.

Amp ★★★
()

С svg все нормально и при больших зумах/размерах.

Конвертировать в svg перед отображением не вариант?

DarkEld3r ★★★★★
()
Ответ на: комментарий от trex6

Ага, CorelDraw через wine приспособить. :-)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.