Функция QPixmap loadFromData использовала какой-то странный механизм для кеша?

В функции QPixmap loadFromData наблюдается странное явление. В этом случае:

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" (они показывают одно и то же изображение).

Кроме того, мы вводим третий объект 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".

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


person Lion Young    schedule 13.11.2014    source источник
comment
Вы удалили свой другой вопрос. Я тоже собирался ответить на это. Если вы создадите два растровых изображения, которые загружают один и тот же файл изображения, оно будет создано только один раз и сохранено в папке QPixmapCache. QPixmap::load указывает: Обратите внимание, что QPixmaps добавляются автоматически в QPixmapCache при загрузке из файла; используемый ключ является внутренним и не может быть получен..   -  person thuga    schedule 13.11.2014
comment
О, да. Я удалил только потому, что вы ответили на этот вопрос, и это как раз о механизме кэширования. Так что, может быть, нам не нужно столько аналогичных вопросов. Так что большое спасибо.   -  person Lion Young    schedule 13.11.2014


Ответы (1)