2014-11-13 2 views
3

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 and test2.png), 맞습니다.

그런 다음 우리가 라인 "pix1 = PIX2"를 변경하는 대신 다음 블록을 사용 :이 labelPix1에 의해 잘 살고 난 후에

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

를이 블록에서 pix1는 PIX2에서 바이트 datas를로드. 분명히 labelPix2는 이미지 "test2.png"를 보여 주지만, labelPix1도 이미지 "test2.png"를 보여줍니다 (동일한 이미지를 보여줍니다).

또한 3 번째 QPixmap 개체 pix3을 소개하고 pix1과 동일한 "test1.png"로 시작합니다. 이 시간 labelPix2는 pix1을 설정하지 않고 pix1이 pix2에서 바이트 데이터를로드 한 후에 pix3을 설정합니다. 다음과 같이하십시오 :

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)는 다음과 같이 설명합니다 : * QPixmap은 파일에서로드 될 때 자동으로 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이 아니라는 것을 알 수 있습니다. 이제 Qt는 내용을 변경하려고 할 때마다 QPixmap::detach을 자동으로 호출해야한다. 그럼 왜이 경우에? 그건 내가 모른다.

관련 문제