0

QWidget処理するがあります。つまり、マウスの左ボタンが押されたときにリストにmouseevent格納されます。mouseposition問題は、ウィジェットにxミリ秒ごとに1ポイントだけを取るように指示できないことです。

これらのサンプルを取得する通常の方法は何でしょうか?

編集:mouseeventはあまり頻繁に呼び出されないので、レートを上げることは可能ですか?

4

5 に答える 5

3

非同期イベント処理はまったく必要ないようです。一定の間隔でカーソルの位置を取得したいだけです。

xミリ秒ごとに起動するようにタイマーを設定します。の値を取得するスロットに接続しますQCursor::pos()QWidget::mapFromGlobal()ウィジェットに対してローカルな座標でカーソル位置が必要な場合に使用します。

マウスの左ボタンが押されているときにのみこれを実行する場合は、とを使用mousePressEvent()mouseReleaseEvent()てタイマーを開始/停止します。

于 2009-07-31T21:51:58.877 に答える
1

2つの選択肢があります。最後のイベントのタイムスタンプ(ミリ秒単位)を格納するロジックをイベントハンドラーに配置することもできます。次に、すべてのイベントでそのタイムスタンプを確認し、適切な期間が経過した場合にのみポイントを保存します。

(これは醜い方法です)xミリ秒ごとにイベントハンドラーを登録するプロセスをアプリのどこかに配置し(まだ登録されていない場合)、イベントハンドラーにハンドラー内のイベントの登録を解除させることもできます。 )。そうすれば、イベントが発生すると、イベントハンドラーは登録解除され、タイマーは指定された間隔でイベントに再登録します。

于 2009-07-31T15:39:38.613 に答える
1

ブール値をtrueに設定するスロットに接続されたシングルショットQTimerを追加し、ブール値がtrueに設定されている場合は、最初にブール値がtrueに設定されていることを確認するようにマウスイベントスロットを変更できます。通常はそうするつもりでしたが、最後にシングルショットQTimerをxミリ秒でオフに設定しました。

于 2009-07-31T15:40:23.883 に答える
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へのキュー接続を使用する場合(別のスレッドにある場合、あなたの場合はありそうにありません)、興味深い信号に直接接続されたプロキシスロットを使用し、その内部をフィルタリングしてから、キューに接続した信号を送信します。そうしないと、イベントループを不必要にスパムする可能性があります。

于 2009-07-31T15:57:18.123 に答える
0

イベントの代わりにタイマーを使用します。

于 2009-07-31T21:57:19.207 に答える