본문 바로가기
SWE/Qt

[QT] QWidget의 스크린 상 좌표얻기 | 마우스 현재 좌표와 QWidget의 좌표 일치 확인

by S나라라2 2020. 3. 2.
반응형

내가 보이는 프로그램의 화면 상에서의 좌표를 얻는 방법

: QWidget::mapToGlobal 이라는 메소드를 사용하면 된다.

 

 

 

예제 코드

QPoint pos = QWidget::mapToGlobal( itmInfo(r,c)->rect.bottomRigth() );

코드 설명

itemInfo(r,c)라는 위젯의 사각형 좌표(rect)를 얻는다.

rect의 bottomRight 메소드는 위젯의 우측하단좌표를 리턴해준다.

 

따라서 pos좌표는 itemInfo(r,c)라는 위젯의 우측 하단 좌표를 스크린상의 좌표로 변환한 것을 가지게 된다.

 

 

 

참고로, QWidget의 rect라는 메소드는 위젯의 좌표를 리턴해주는데, 이 값은 윈도우 프레임에서 본 값이 아니다.

(parent 위젯 안에서의 상대적 좌표인듯하다.)

 

 

응용예제 : 마우스가 해당 QWidget을 가리키는 건지 확인하는 방법

마우스 현재 좌표가 해당 QWidgt을 가리키는 건지 확인하기 위해서는, 마우스 좌표와 QWidget 좌표의 비교가 필요하다.

QPoint mousePoint = QCursor::pos();

for(int r=0; r<m_rowCount; r++)
{
	for(int c=0; c<m_columnCount; c++)
    {
    	QPoint pos = QWidget::mapToGlobal( itemInfo(r,c)->rect.bottomRight() ):
        
        if( mousePoint.y() > pos.x() )
        {
        	break;
        }
        else if( mousePoint.x() < pos.x() )
        {
        	return itemInfo(r, c);
        }
    }
}

 

코드 설명

마우스 좌표는 QCursor::pos() 메소드를 통해 얻어올 수 있다.

 

그리고 좌표 x, y를 각각 모두 비교하는 것이 아니라, rect의 contains() 메소드를 사용하면 해당 위젯안에 들어간 좌표인지 확인이 가능하다. 다만, 내 코드상에서는 tabel에 들어있는 아이템(widget)을 비교하는 것이였기 때문에

row 좌표가 범위바깥일 경우 다른 column들의 위젯은 비교할 필요가 없었다. 따라서 내 코드에서는 저 방법이 더 효율적이였다.

 

 

반응형