2017-09-19 15 views
0

위젯 내에서 QRect 또는 QPoint의 좌표를 가져 와서 해당 객체가 가장자리와 겹치고 위젯 외부로 그려지는지 확인하려고합니다.Qt - translate() 후 위젯 내 직사각형 위치 가져 오기

다음 프로그램은 내 문제를 보여주기위한 테스트 프로그램 일뿐입니다. 창에 검은 색 직사각형이 그려집니다. QPainter의 translate()를 사용하여 좌표계를 이동합니다. 그 후 직사각형의 정확한 좌표를 얻을 수 없습니다.

모든 좌표계 조작 (translate(), rotate(), scale())을 추적 할 수 있지만 좋은 해결책은 아닙니다. 위젯의 왼쪽 위 모서리를 기준으로 사각형의 위치를 ​​얻는 더 쉬운 방법이 있습니까? 내가하고 싶으 woul 무엇

#include "widget.h" 
#include <QPainter> 
#include <iostream> 

Widget::Widget(QWidget *parent)  
    : QWidget(parent) 
{ 

} 

void Widget::paintEvent(QPaintEvent *) 
{ 
    QPainter painter(this);  
    painter.translate(width()/2, height()/2); 

    QRect rectangle(100, 50, 200, 100); 

    std::cout << "width(): " << this->width() << "\theight(): " << this->height() 
       << "\trecLeft X: " << rectangle.x() << "\trecTop Y: " << rectangle.y() 
       << std::endl; 
    //Output: width(): 960 height(): 432 recLeft X: 100 recTop Y: 50 
} 

은 다음과 같습니다

recLeft X: 580(width()/2+100) recTop Y: 266(height()/2+50)

+0

그래도 화가의 변환이 사각형 좌표에 영향을 줍니까? – vahancho

답변

0

당신은 화가의 변환 행렬을 얻을하고 사각형에 적용 할 수 있습니다. 다음과 같아야합니다.

QTransform trans= painter.combinedTransform(); 
QRect transformed = trans.mapRect(rectangle); 
+0

'QRectangle'은 실제로'QPolygon'으로 매핑됩니다. 이 경우'boundingRect'를 사용할 수 있습니다. –

+0

@MatteoItalia 당신이 맞아요. 예제를 수정했습니다. –

+0

'QPolygon' 생성자를 삭제할 수 있습니다. 거기에'QRectangle'을 취하고'QPolygon'을 반환하는'map' 오버로드가 있습니다. –