2012-11-11 3 views
1

웹 사이트의 favicon.ico 파일에서 QIcon 개체를 만들려고합니다. 이 다운로드는 GUI 스레드에서 반드시 발생하는 것은 아니기 때문에 QPixmap을 사용할 수 없으며 QPixmap을 사용하지 않고 QImage에서 QImage로 변환하는 방법을 찾지 못한 채 QImageReader와 같은 것을 사용할 수 없습니다.QPixmap을 사용하지 않고 favicon.ico를 QIcon으로 가져 오기

나는하려면 다음 코드를 입수했습니다 :

QUrl url("http://www.google.com/favicon.ico"); 
QNetworkRequest request(url); 

QNetworkReply* pReply = manager.get(request); 

// ... code to wait for the reply ... 

QByteArray bytes(pReply->readAll()); 

QFile file("C:/favicon.ico"); 
file.open(QIODevice::WriteOnly); 
file.write(bytes); 
file.close(); 

QIcon icon("C:/favicon.ico"); 
return icon; 

는 그러나, 나는 임시 파일을 작성하지 않도록합니다. 그래서 같은 것을 시도했습니다 ...

QBuffer buffer(&bytes); 
buffer.open(QIODevice::ReadOnly); 
QDataStream ds(&buffer); 

QIcon icon; 
ds >> icon; 

하지만 작동하지 않습니다.

누구에게 의견이 있습니까?

+0

어떻게 작동하지 않습니까? 런타임 오류가 발생 했습니까? 그렇다면 오류가 무엇입니까? –

+0

런타임 오류가 없습니다. 내가 QStandardItem을 추가하고 내가 만들고있는 항목에 아이콘을 전달하는 QTreeView에서 반환 된 QIcon을 사용합니다. 앞에서 언급했듯이 QByteArray를 임시 파일에 쓴 다음이 파일을 사용하여 QIcon을 초기화하면 작동합니다. QDataStream 메소드를 사용하면 트리에 아이콘이 표시되지 않습니다. – Addy

답변

2

QDataStream 스트림에서 PNG 이미지가 예상되므로 작동하지 않습니다.

후드 아래에 여전히 QPixmap을 구성 할 수 있으므로 임시 파일 접근 방식을 사용하지 않을 것입니다. 실제로 QIcon은 스레드로부터 안전하다는 보장은 없으며 비 GUI 스레드에서의 사용은 피해야합니다.

바이트 배열을 그대로 유지하고 GUI 스레드로 다시 전달합니다. 그것을 보여줄 필요가있을 때 QPixmap과 QIcon으로 변환하십시오. 어쨌든 계산이 그리 무겁지는 않습니다.

관련 문제