2016-10-12 10 views
2

私は2つのアクションを実行するQPushButtonを持っています。 autoRepeatによる呼び出しを含め、ボタンの押されたスロットが呼び出されるたびに1つのアクションが発生する必要があります。 2番目のアクションは、ボタンが最初に押されたときに開始され、ユーザーがそれ以上保持しない場合にのみ終了する必要があります。QPushButtonの解放された信号が自動リピートまたは実際のマウスの解放の結果であるかどうかを判断する方法

問題は、autoRepeatがボタンの押された、リリースされた、クリックされた信号をトリガーすることです。この結果、第2のアクションが終了し、ボタンが押されている間持続するのではなく、すべての繰り返しで再び開始される。既存の押されたスロットと解放されたスロットだけを使用してボタンが実際にユーザーから解放されたかどうかを確認するにはどうすればよいですか?

例コード:

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を返しますので、これは動作します。これらの変更を行う

は、次のコードを生成します。

関連する問題