2016-03-16 5 views
0

У меня есть подкласс QGraphicsSvgItem, который содержит svg, который я могу изменить на основе действий пользователя.Могу ли я повторно использовать QSvgRenderer при изменении содержимого QByteAray?

У меня может быть несколько элементов такого типа - они создаются путем загрузки svg и установки на них нового рендеринга svg. Я не уверен, что это самый эффективный способ - так я видел это в примерах.

Я храню svg после загрузки в QByteArray - для быстрых изменений я заменю строку на вещи, которые может измениться. (Я пытался использовать xml, но конверсии до QByteAray слишком медленные).

Так ... по пункту нагрузки, я:

inFile >> m_svgContents; // which is QByteArray 
setSharedRenderer(new QSvgRenderer(m_svgContents)); 

Тогда на каких-либо изменений, m_svgContents модифицируется, и я должен сделать

m_svgContents.replace(oldInfo, newInfo); 
delete renderer(); 
setSharedRenderer(new QSvgRenderer(m_svgContents)); 

Я просто добавил delete renderer();, потому что я побежал valgrind, и он обнаружил утечку памяти.

Кажется очень тяжелым, чтобы каждый раз создавать новый визуализатор ...
Можно ли повторно использовать средство визуализации? «Общий рендерер» предполагает, что я мог бы поделиться им между несколькими элементами - что, вероятно, не полезно для меня, потому что каждый элемент может иметь различный контент svg, и я понимаю, что каждый рендеринг имеет другой файл svg ...

Но возможно ли повторное использование вместо удаления и создания нового средства визуализации, когда я изменяю содержимое svg?

ответ

2

А как насчет QSvgRenderer::load()? Он должен заменить текущий SVG-контент новым.

+0

Спасибо, я могу использовать это. Кажется, это не вызывает обновления - поэтому я должен сам это назвать - и получаю странные результаты, если я использую его при первой загрузке ... (если 'renderer()' я пытался «загружать» вместо 'new' и получил гигантский svg) – Thalia