2014-11-13 11 views
3

Существует странное явление в функции loadFromData QPixmap. Это тот случай:Функция загрузки QPixmapFromData использовала какой-то странный механизм для кеша?

QPixmap pix1(":/test1.png");  
QPixmap pix2(":/test2.png"); 
ui->labelPix1>setPixmap(pix1); 
pix1 = pix2; 
ui->labelPix2->setPixmap(pix1); 

В приведенном выше коде, контроль буксировка этикетки загрузили же QPixmap объект PIX1, но PIX1 был изменен до labelPix2 загрузить его, поэтому эвакуаторы этикетки показать различные изображения (test1.png и test2.png), это правильно.

Тогда мы изменить строку «PIX1 = PIX2», используйте следующий блок вместо:

QByteArray ba; 
QBuffer buf(&ba); 
pix2.save(&buf, "PNG"); 
pix1.loadFromData(ba); 

В этом блоке PIX1 загружены байт ДАННЫЕ из pix2 после того, как она выставиться от labelPix1. Очевидно, labelPix2 показывает изображение «test2.png», но странно, что labelPix1 также показывает изображение «test2.png» (они показывают одно и то же изображение).

Кроме того, мы представляем 3-й объект QPixmap pix3 и инициализируем его «test1.png» так же, как pix1. На этот раз labelPix2 не устанавливает pix1, а устанавливает pix3 после pix1 загружает данные байта из pix2. Так же, как это:

QPixmap pix1(":/test1.png");  
QPixmap pix2(":/test2.png"); 
QPixmap pix3(":/test1.png"); 
ui->labelPix1>setPixmap(pix1); 

QByteArray ba; 
QBuffer buf(&ba); 
pix2.save(&buf, "PNG"); 
pix1.loadFromData(ba); 

ui->labelPix2->setPixmap(pix3); 

О, labelPix1 и labelPix3 показывают один и тот же образ, "test2.png".

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

+0

Вы удалили свой другой вопрос. Я тоже собирался ответить на это. Если вы создаете две растровые карты, которые загружают один и тот же файл изображения, он будет создавать его только один раз и хранить его в 'QPixmapCache'. ['QPixmap :: load'] (http://qt-project.org/doc/qt-5/qpixmap.html#load) указывает: * Обратите внимание, что QPixmaps автоматически добавляются в QPixmapCache при загрузке из файла; используемый ключ является внутренним и не может быть приобретен. *. – thuga

+0

О, да. Я удалил только потому, что вы ответили на этот вопрос, и это всего лишь «механизм для кеша». Поэтому, возможно, нам не нужно так много аналогичных вопросов. Так что спасибо вам большое. –

ответ

3

Это связано с implicit sharing. Я не знаю, намеренно это или нет. Но если вы посмотрите на QPixmap::load, вы заметите, что он вызывает QPixmap::detach. Это означает, что он больше не будет работать с общими данными. И документы говорят: A pixmap is automatically detached by Qt whenever its contents are about to change..

Но теперь, когда вы смотрите на QPixmap::loadFromData, вы заметите, что он не звонит QPixmap::detach. Теперь, когда я цитировал документы раньше, QPixmap::detach должен автоматически вызываться Qt, когда его содержимое вот-вот изменится. Так почему бы не в этом случае? Этого я не знаю.

 Смежные вопросы

  • Нет связанных вопросов^_^