2011-10-14 1 views
2

나는 QGraphicsScene을 가지고 있으며 몇 개의 QGraphicsItem을 장면에 추가한다. 장면에 추가되는 모든 항목은 QGraphicsPixmapItem입니다.그래픽 GUI에 표시된 항목에 멋진 "미러"효과를 어떻게 만듭니 까?

장면에 추가 된 각 항목에 대해 "표시된"출력 장면이 "미러"시각 효과를 갖기를 원합니다. 난 당신이 앨범을 표시 할 때 영향을 아이튠즈 미러에 작은 선물을 찾기 위해 "거울"시각 효과를 싶습니다

Example "mirror" effect from http://www.steelskies.com/site/images/iTunesBrowserThumb.jpg

(참고 :. 위에서 본 이미지는 "CoverFlow company website"에서이다 CoverFlow와는 사람들은 그 나는 아이튠즈 앨범 디스플레이 "거울"시각 효과를 구현하는 것 같아요.)

이 장면의 각 항목이 그 아래에 거울을 가지고있는 것에 유의하십시오.

각 항목에 대해 어떻게이 "거울"시각 효과 (스크린 샷에서 볼 수 있음)를 만드나요?

+0

내 첫번째 생각 : 요청으로이 내 테스트 코드의 출력 QGraphicsItemGroup에서 상속받은 새 클래스를 만듭니다. 생성자는 입력으로 pixmap을가집니다. 두 개의 QGraphicsPixmapItem을 만듭니다. QGraphicsItemGroup에 둘 다 추가하십시오. 두 번째 그래픽 항목을 "미러"(구현에 따라 ...)로 배열하십시오. –

답변

6

이것이 내가하는 방법이라고 생각합니다. 나는 이것이 당신의 의견에 따라 좋을 것 같아요.

QPainter를 사용하여 원본에서 반영된 반사 이미지를 만들고 QPainter를 다시 사용하여 두 이미지를 병합합니다. 이 결과 이미지는 QGraphicsPixmapItem을 사용하여 표시된 이미지입니다. 아래 코드에서 이미지의 반영된 미러 버전을 만들었습니다. 매개 변수를 조정하고 병합하면됩니다.

#include <QApplication> 
#include <QLabel> 
#include <QPixmap> 
#include <QPainter> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    // Just to show the original image. 
    QLabel label; 
    QImage original(<place_an_image_path_here>); 
    label.setPixmap(QPixmap::fromImage(original)); 
    label.show(); 

    // Create the gradient that will be placed over the image. 
    QPoint start(0, 0); 
    QPoint end(0, original.height()); 
    QLinearGradient gradient(start, end); 
    gradient.setColorAt(0.0, Qt::white); 
    gradient.setColorAt(0.5, Qt::black); 

    // Create the mask to be used on the mirrored image. 
    QImage mask(original.size(), original.format()); 
    QPainter painter(&mask); 
    // You may want to add additional opacity according 
    // to the sample image shown. 
    painter.setOpacity(0.8); 
    painter.fillRect(original.rect(), gradient); 
    painter.end(); 

    // Create the mirrored reflection. 
    QImage reflection = original.mirrored(); 
    reflection.setAlphaChannel(mask); 

    // Just to show the result. 
    QLabel labelReflection; 
    labelReflection.setPixmap(QPixmap::fromImage(reflection)); 
    labelReflection.show(); 

    return a.exec(); 
} 

당신은 QGraphicsPixmapItem의 결과 이미지 (두의 병합의 결과를)로드 할 수 있습니다 그리고 당신은 당신이 필요로하는 모든 변환을 적용하는 갈 수 있습니다.

편집 : 제공되는 이미지가 나타내는 것처럼 추가 불투명도를 설정하는 것을 잊어 버릴 수 있습니다. 시도하지는 않았지만 QPixmaps를 사용하여 동일한 작업을 수행 할 수도 있습니다. 이렇게하면 성능이 향상되거나 사용중인 플랫폼 및 페인트 엔진에 따라 그림이 빨라질 수도 있습니다.

EDIT2 : Output of the code reported (내가 확인하기 위해 시도했지만 아무것도 기록되지 않았다,이 이미지는 일부 저작권 또는 유사한받지 않는 희망)

+0

몇 줄의 코드에서 인상적인 결과를 얻었습니다. –

+0

내가 스크린 샷을 올리면 귀하의 게시물이 더욱 인상적 일 것이라고 생각합니다. (그동안 원래/반사를 하나의 graphicsItem으로 병합하는 작업을하게 될 것입니다.) –

+0

"나는이 이미지가 저작권이 없길 바래요."라는 대답을 보았습니다. 저작권에 대해 걱정이된다면 언제든지 이미지 편집기를 열어서 자신의 이미지를 만들 수 있습니다 (EX : 텍스트 도구를 사용하여 이미지의 일부 텍스트 "helloworld"를 래스터 화). –

관련 문제