をQWidget
処理するがあります。つまり、マウスの左ボタンが押されたときにリストにmouseevent
格納されます。mouseposition
問題は、ウィジェットにxミリ秒ごとに1ポイントだけを取るように指示できないことです。
これらのサンプルを取得する通常の方法は何でしょうか?
編集:mouseevent
はあまり頻繁に呼び出されないので、レートを上げることは可能ですか?
をQWidget
処理するがあります。つまり、マウスの左ボタンが押されたときにリストにmouseevent
格納されます。mouseposition
問題は、ウィジェットにxミリ秒ごとに1ポイントだけを取るように指示できないことです。
これらのサンプルを取得する通常の方法は何でしょうか?
編集:mouseevent
はあまり頻繁に呼び出されないので、レートを上げることは可能ですか?
非同期イベント処理はまったく必要ないようです。一定の間隔でカーソルの位置を取得したいだけです。
xミリ秒ごとに起動するようにタイマーを設定します。の値を取得するスロットに接続しますQCursor::pos()
。QWidget::mapFromGlobal()
ウィジェットに対してローカルな座標でカーソル位置が必要な場合に使用します。
マウスの左ボタンが押されているときにのみこれを実行する場合は、とを使用mousePressEvent()
しmouseReleaseEvent()
てタイマーを開始/停止します。
2つの選択肢があります。最後のイベントのタイムスタンプ(ミリ秒単位)を格納するロジックをイベントハンドラーに配置することもできます。次に、すべてのイベントでそのタイムスタンプを確認し、適切な期間が経過した場合にのみポイントを保存します。
(これは醜い方法です)xミリ秒ごとにイベントハンドラーを登録するプロセスをアプリのどこかに配置し(まだ登録されていない場合)、イベントハンドラーにハンドラー内のイベントの登録を解除させることもできます。 )。そうすれば、イベントが発生すると、イベントハンドラーは登録解除され、タイマーは指定された間隔でイベントに再登録します。
ブール値をtrueに設定するスロットに接続されたシングルショットQTimerを追加し、ブール値がtrueに設定されている場合は、最初にブール値がtrueに設定されていることを確認するようにマウスイベントスロットを変更できます。通常はそうするつもりでしたが、最後にシングルショットQTimerをxミリ秒でオフに設定しました。
フィルタリングします。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へのキュー接続を使用する場合(別のスレッドにある場合、あなたの場合はありそうにありません)、興味深い信号に直接接続されたプロキシスロットを使用し、その内部をフィルタリングしてから、キューに接続した信号を送信します。そうしないと、イベントループを不必要にスパムする可能性があります。
イベントの代わりにタイマーを使用します。