2014-05-19 2 views
3

this sample code을 기반으로 C++에서 새로운 QML 요소를 개발하고 있습니다. 내 클래스는 QDeclarativeItem에서 상속과는 paint() 방법은 화면에 QImage을 그릴 책임이있다 :QPainter :: drawImage() QDeclarativeItem에서 X, Y가 0이 아닌 경우 Qimage를 자릅니다.

void NewQMLitem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 
{ 
    // image is QImage* that was loaded at the constructor of the class 
    painter->drawImage(0, 0, *image); 
} 

위젯의 크기는 800 × 480이며, 이미지는 400x240입니다.

을 내가 직면하고있어 문제는 임의의에서 그리기와 같은 좌표입니다 : 도면이 (0, 0)에서 시작으로 아래 볼 수 아래의 코드는, 한 완벽하게 작동 (200, 0), 그림을 클립하는 것 같습니다.

void NewQMLitem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 
{ 
    painter->drawImage(200, 0, *image); 
} 

그리고 다음은 결과입니다 :

나의 현재 해결 방법은 마지막에 widget->update()를 호출 포함 QPainter를는 (0, 0)에서 시작 화면을 업데이트 것 같습니다 paint() 물론 위젯이 두 번 칠해지기 때문에 이것은 끔찍한 일입니다.

이 문제를 해결하는 적절한 방법은 무엇입니까? 저는 현재 Windows에서 Qt 5.2를 사용하고 있습니다. 이러한 상황에서 당신은 부모 위젯의 크기/위치가 변경되었음을 알려 전화 prepareGeometryChange() 필요하고, 그가에 제대로 페인트 할 수 있도록 새로운 형상을 조회 할 필요가 있다고

+0

그것은 서로 다른 이미지처럼 보인다. 두 번째 이미지의 왼쪽에있는 회색 대각선 줄무늬는 첫 번째 이미지에 없습니다. 그리고 당신이 생각하는 검은 부분이 "잘린"것일 수도 있습니다. –

+0

사실! 위의 이미지는 웹캠에서 실시간 캡처하는 동안 찍은 위치입니다. 내 응용 프로그램이 디스크의 정적 이미지를로드하지 않습니다. 그 점을 지적 해 주셔서 감사합니다. – karlphillip

+0

Qt에 버그가있는 것 같습니다 (코드에있을 수도 있지만 Qt에 익숙하지 않고 그림에 영향을주는 상태가 있는지). 나는 drawImage의 다른 과부하 중 하나를 시도 할 것이다. –

답변

2

I found out 화면.

이것은 부모이 위젯에 boundingRect()를 호출 할 것이다, 그래서 그것을 구현하는 것은 귀하의 책임입니다 :

void NewQMLitem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 
{ 
    prepareGeometryChange() 
    painter->drawImage(200, 0, *image); 
} 

QRectF NewQMLitem::boundingRect() const 
{ 
    return QRectF(m_x, m_y, m_width, m_height); 
} 
관련 문제