2009-07-31 5 views
0

나는 mouseevent을 처리하는 QWidget을 가지고 있습니다. 즉, 왼쪽 마우스 버튼을 누르면 mouseposition가 목록에 저장됩니다. 문제는 위젯이 매 xms마다 단 하나의 지점 만 가져 오도록 말할 수는 없다는 것입니다.정의 된 시간에만 이벤트를 얻는 방법은 무엇입니까?

이러한 샘플을 얻는 일반적인 방법은 무엇입니까?

편집 : mouseevent이 자주 호출되지 않기 때문에 속도를 높일 수 있습니까?

+0

왜 마우스 이벤트 속도 제한이 필요하다고 생각 하는지를 알 수 있다면 더 잘 도와 줄 수 있습니다. Qt 배포판의 scribblearea 예제를보고 마우스를 매우 빠르게 움직이면 두 마우스 이벤트 사이에 100 픽셀 이상의 거리가있을 수 있으므로 속도가 낮은 것으로 보입니다. –

+0

데이터 소스 (센서)에서받은 신호를 시뮬레이트/테스트하는 데이 파일을 사용하고 싶습니다. 마우스로 몇 가지 검사를하는 것이 더 쉽습니다. – Burkhard

답변

3

비동기 이벤트 처리를 원하지 않는 것처럼 들리지만 고정 된 간격으로 커서의 위치를 ​​얻고 싶을뿐입니다.

매 x 밀리 초마다 발사하도록 타이머를 설정하십시오. QCursor::pos() 값을 얻는 슬롯에 연결하십시오. 위젯에 로컬 좌표로 커서 위치가 필요한 경우 QWidget::mapFromGlobal()을 사용하십시오.

왼쪽 마우스 단추를 누르고있는 동안에만이 작업을 수행하려는 경우 mousePressEvent()mouseReleaseEvent()을 사용하여 타이머를 시작/중지하십시오.

+0

그게 내가 필요한 것입니다. 감사. – Burkhard

1

두 가지 선택 사항이 있습니다. 마지막 이벤트의 타임 스탬프 (밀리 초)를 저장하는 이벤트 처리기에 논리를 넣을 수도 있습니다. 그런 다음 모든 이벤트에 해당 타임 스탬프를 확인하고 적절한 시간이 경과 한 경우에만 포인트를 저장하십시오.

(이것은 못생긴 방식입니다.) 앱에 어딘가에 언제든지 x 밀리 초마다 이벤트 핸들러를 등록한 다음 (해당 이벤트가 아직 등록되지 않은 경우) 이벤트 처리기의 등록을 취소 할 수 있습니다. 이벤트 처리기). 그런 식으로 이벤트가 발생하면 이벤트 핸들러가 등록 해제되고 지정된 간격으로 이벤트에 대한 타이머가 다시 등록됩니다.

1

boolean을 true로 설정하는 슬롯에 연결된 단일 샷 QTimer를 추가하고 bool이 true인지 확인하기 위해 마우스 이벤트 슬롯을 수정하고 false로 설정하면, 정상적으로 수행 할 코드를 작성한 다음, 마지막에 단일 샷 QTimer를 x ms로 설정하십시오.

1

필터링하십시오. x ms가 경과하지 않는 한 모든 입력을 무시하십시오 (목록에 넣지 마십시오).

QTime m_time; // member of your class 
int m_interval = 100; // ms 

void MyWidget::StartCapturing() 
{ 
    m_time.start(); 
} 

void MyWidget::OnMouseEvent(...) 
{ 
    if(m_time.elapsed() < m_interval) 
     return; 

    // process event 

    m_time.reset();   
} 

편집 : 혹시 당신이 OnMouseEvent (이것은 귀하의 경우 가능성이 다른 스레드에있는 경우)에 연결을 대기 사용하는 경우, 프록시 슬롯을 사용하는 것은 바로 당신에게 흥미 신호를 연결 필터 안에 만 다음 방출 대기중인 신호를 연결합니다. 그렇지 않으면 무의식적으로 이벤트 루프를 스팸 할 수 있습니다.

+0

마우스 이벤트는 신호/슬롯 연결과 함께 전달되는 것이 아니라 가상'QWidget :: mouseEvent()'메서드에 전달됩니다. 그래도 일반적인 생각은 옳습니다. –

0

이벤트 대신 타이머를 사용하십시오.

관련 문제