문제

나는 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에 대기열 연결을 사용하는 경우 (케이스에서는 다른 스레드에있는 경우) 직접 연결된 프록시 슬롯을 사용하여 흥미로운 신호를 직접 연결하고 내부에 필터링 한 다음 큐에 연결된 신호를 방출하십시오. 그렇지 않으면 이벤트 루프를 스팸으로 만들 수 있습니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top