2016-03-16 48 views
0

我有一個QGraphicsSvgItem子類,其中包含一個可以根據用戶操作更改的svg。我可以在修改QByteAray內容時重用QSvgRenderer嗎?

我可以有多個這種類型的項目 - 它們通過加載一個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

相關問題