2016-10-12 7 views
2

두 가지 작업을 수행하는 QPushButton이 있습니다. autoRepeat를 통한 호출을 포함하여 버튼을 누른 슬롯이 호출 될 때마다 하나의 액션이 발생해야합니다. 두 번째 작업은 버튼을 처음 눌렀을 때 시작되어 더 이상 사용자가 누르고 있지 않을 때만 끝나야합니다.QPushButton의 해제 된 신호가 자동 반복 또는 실제 마우스 해제의 결과인지 확인하는 방법

문제는 autoRepeat가 버튼의 눌렀다가 놓은 신호를 트리거한다는 것입니다. 그 결과 두 번째 작업이 끝나고 버튼을 누르고있는 동안 지속되는 대신 모든 반복에서 다시 시작됩니다. 기존의 눌렀다 놓은 슬롯 만 사용하여 버튼이 실제로 사용자에 의해 해제되었는지 어떻게 확인할 수 있습니까?

예제 코드 :

void MyClass::on_button_pressed() 
{ 
    startHeldAction(); 
    doRepeatedAction(); 
} 

void MyClass::on_button_released() 
{ 
    stopHeldAction(); 
} 

답변

0

나는 다음 단계를 복용하면 추가 이벤트 처리가 필요하지 않은 비교적 간단한 솔루션을 남겼습니다 :

  1. 하는 bool 형식의 클래스 멤버 isHeld 작성을 그 기본값은 false입니다.
  2. 누르는 슬롯 내에서 isHeld을 확인하십시오. if가 false이면 isHeld을 true로 설정하고 startHeldAction()으로 전화하십시오.
  3. 해제 된 슬롯에서 down property 버튼을 확인하십시오. false이면 isHeld를 false로 설정하고 stopHeldAction()을 호출하십시오.

    void MyClass::on_button_pressed() 
    { 
        if(!isHeld) 
        { 
         isHeld = true; 
         startHeldAction(); 
        } 
        doRepeatedAction(); 
    } 
    
    void MyClass::on_button_released() 
    { 
        if(!ui->button->isDown()) 
        { 
         isHeld = false; 
         stopHeldAction(); 
        } 
    } 
    

    사용자가 실제로 마우스 버튼을 해제하지 않는 한 isDown()가 발표 슬롯에 true를 돌려 때문 작동 : 이러한 변경을 만들기

는 다음 코드를 생성합니다.