質問

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

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

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

役に立ちましたか?

解決

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

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

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

他のヒント

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

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

ブール値をtrueに設定するスロットに接続されたシングルショットQTimerを追加し、boolが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へのキュー接続を使用する場合(別のスレッドにある場合は、おそらくそうではありません)、プロキシスロットを使用して、興味深い信号を直接接続し、内部でフィルター処理してから、キューに接続した信号のみを送信しますに。そうしないと、イベントループを不注意にスパムする可能性があります。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top