정해진 시간에만 이벤트를 획득하는 방법은 무엇입니까?
-
06-07-2019 - |
문제
나는 QWidget
처리하는 mouseevent
, 즉.그것은 저장합니다 mouseposition
마우스 왼쪽 버튼을 누르면 목록에 표시됩니다.문제는 위젯이 xms마다 한 점만 가져오도록 지시할 수 없다는 것입니다.
이러한 샘플을 얻는 일반적인 방법은 무엇입니까?
편집하다:이후 mouseevent
자주 호출되지 않는데 속도를 높일 수 있나요?
해결책
비동기 이벤트 처리를 전혀 원하지 않는 것처럼 들리며 고정된 간격으로 커서의 위치를 가져오고 싶을 뿐입니다.
x 밀리초마다 실행되도록 타이머를 설정하세요.값을 얻는 슬롯에 연결하십시오. QCursor::pos()
.사용 QWidget::mapFromGlobal()
위젯의 로컬 좌표에 커서 위치가 필요한 경우.
마우스 왼쪽 버튼을 누르고 있는 동안에만 이 작업을 수행하려면 다음을 사용하십시오. mousePressEvent()
그리고 mouseReleaseEvent()
타이머를 시작/중지하려면
다른 팁
당신은 두 가지 선택이 있습니다. 마지막 이벤트의 타임 스탬프 (밀리 초)를 저장하는 이벤트 핸들러에 논리를 넣을 수 있습니다. 그런 다음 모든 이벤트마다 타임 스탬프를 확인하고 적절한 시간대가 통과 된 경우에만 포인트를 저장하십시오.
(이것은 추악한 방법입니다) 당신은 항상 앱 어딘가에 X 밀리 초마다 이벤트 핸들러를 등록하는 프로세스 (아직 등록되지 않은 경우)와 핸들러에서 이벤트에 등록하지 않도록하는 프로세스가있을 수 있습니다. ). 이렇게하면 이벤트가 발생하면 이벤트 핸들러가 등록되지 않고 타이머가 지정된 간격으로 이벤트를 다시 등록합니다.
부울을 true로 설정하는 슬롯에 연결된 단일 샷 QTimer를 추가하고 마우스 이벤트 슬롯을 먼저 수정하여 먼저 bool을 확인하고 거짓으로 설정되면 코드를 작성하십시오. 일반적으로 할 것입니다. 그리고 끝에 싱글 샷 QTimer가 X MS에서 떠날 것입니다.
필터링하십시오. 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에 대기열 연결을 사용하는 경우 (케이스에서는 다른 스레드에있는 경우) 직접 연결된 프록시 슬롯을 사용하여 흥미로운 신호를 직접 연결하고 내부에 필터링 한 다음 큐에 연결된 신호를 방출하십시오. 그렇지 않으면 이벤트 루프를 스팸으로 만들 수 있습니다.
이벤트 대신 타이머를 사용하십시오.