3

Qt でロータリー ウィジェットを実装しました。ユーザーがロータリーをクリックすると、マウス カーソルが非表示になり、マウスを左/下にドラッグするとロータリーが反時計回りに回転し、マウスを右/上にドラッグするとロータリーが時計回りに回転します。マウスを離すと、マウス カーソルはクリックした元の位置に設定されます。次のように実装します。

void RotaryWidget::mousePressEvent(QMouseEvent *MouseEvent)
{
    mMousePos = QCursor::pos();
    mPreviousPos = MouseEvent->pos();
    setCursor(Qt::BlankCursor);
}

void RotaryWidget::mouseReleaseEvent(QMouseEvent *MouseEvent)
{
    QCursor::setPos(mMousePos);
    unsetCursor();
}

void RotaryWidget::mouseMoveEvent(QMouseEvent *MouseEvent)
{
    QPoint DeltaPos = MouseEvent->pos() - mPreviousPos;
    // Use DeltaPos to move my rotary
    mPreviousPos = MouseEvent->pos();
}

これの利点は、連続して複数のロータリーがある場合、ユーザーが調整を行うのがより迅速になることです。

上記のコードにはバグがあり、カーソルが画面の端に来ると、マウスを動かすことができず、ロータリーが動かないというバグがあります。ただし、ユーザーはカーソルを見ることができないため、問題があります。私はそれmouseMoveEventを修正するために変更しました:

void RotaryWidget::mouseMoveEvent(QMouseEvent *MouseEvent)
{
    if(MouseEvent->globalPos() == mMousePos)
    {
        mPreviousPos = mapFromGlobal(mMousePos);
        return;
    }
    else
    {
        QCursor::setPos(mMousePos);
    }
    QPoint DeltaPos = MouseEvent->pos() - mPreviousPos;
    // Use DeltaPos to move my rotary
    mPreviousPos = MouseEvent->pos();
}

基本的に、マウスが移動するたびに変化が計算され、カーソルが元のプレス位置に戻されます (画面から消えることはありません)。上部のifは、マウスの位置を何度も元の位置に設定し続けないようにします。

これは非タッチ スクリーン デバイスでは問題なく動作しますが、タッチ スクリーン デバイスでQCursor::setPos()は機能しません。これは、画面上の指の位置をプログラムで設定できないためです。

私が説明したすべての要件を満たす解決策を思いつきませんでした。ユーザーがタッチスクリーンを使用しているかどうかを検出する方法があれば修正できますが、Qt にはそのような機能が見つかりません。

4

1 に答える 1