3

ハードウェアをシミュレートする Qt プログラムを作成しています。ボタンのプレス、ホールド、およびリリース イベントをシミュレートしたいと考えています。私のアプリケーションでは、キーボードとマウスの両方のクリックからの入力を処理して、ユーザー (つまり私) にとって便利なものにしたいと考えています。奇妙な動作に気付きましたが、理解できません。

アプリケーションは QPushButton をautoRepeat有効にして 100 ミリ秒で使用しautoRepeatDelayautoRepeatInterval. ボタンをマウスでクリックすると、「押された」イベントと「離された」イベントが交互に表示されます。1 ~ N-1 の「押された」イベントの後に「解放された」イベントが続くと予想していました。なぜQtはそのように振る舞うのですか?

また、キーボードからのボタンの押下を処理する次のコードも実装しました。

void MyApp::keyPressEvent(QKeyEvent *event)
{
    QString s = QString("My PRESS key is %1. The counter is %2").arg(event->text(), QString::number(keyCounter));
    qDebug() << s;
    keyCounter++;
}

void MyApp::keyReleaseEvent(QKeyEvent *event)
{
    QString s = QString("My RELEASE key is %1. The counter is %2").arg(event->text(), QString::number(keyCounter));
    qDebug() << s;
    keyCounter = 0;
}

bool MyApp::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::KeyPress)
    {
        this->keyPressEvent(dynamic_cast<QKeyEvent*>(event));
        return true;
    }
    else if (event->type() == QEvent::KeyRelease)
    {
        this->keyReleaseEvent(dynamic_cast<QKeyEvent*>(event));
        return  true;
    }
    else
    {
        return QObject::eventFilter(obj, event);
    }
}

ここでは、2 種類の動作が見られます。英数字キーの場合、「押された」イベントと「離された」イベントが交互に表示されます。矢印キーについては、「リリースされた」イベントのみが表示されます。繰り返しますが、1 ~ N-1 の「押された」イベントの後に「解放された」イベントが続くと予想していました。矢印キーの動作が英数字キーと異なるのはなぜですか?

私がやろうとしていることはQtで可能ですか?

4

2 に答える 2

3

これが私の解決策です。最初に、矢印キーがそれらを生成していないことがわかったので、autoRepeat処理を無効にして停止しました。keyPressEvents代わりに、使用したいキーボード ボタンのショートカットを登録しました。

QShortcut *shortcutUp = new QShortcut(QKeySequence("Up"), this);
QObject::connect(shortcutUp, SIGNAL(activated()), this, SLOT(on_upButton_pressed()));
shortcutUp->setAutoRepeat(false);

次に、on_upButton_pressed()関数(たとえば)で、ボタンが押されたことを示すフラグを設定しました。このフラグはon_upButton_released()関数内でクリアされます。そのフラグは 100 ミリ秒間隔で (QTimer を使用して) チェックされます。フラグが true の場合、on_upButton_pressed()再度呼び出します。これの意味は:

  • マウス クリックまたはキーボード ボタンを押すたびに、1 つの「Press」イベントが生成されます
  • 「Press」イベントは、QTimer によってチェックされるフラグを設定します
  • フラグが の場合true、別の「Press」イベントが生成されます
  • マウスまたはキーボードのボタンが離されると、「Release」イベントが生成され、フラグがクリアされます。

それは今働いています。

于 2014-09-17T02:20:41.173 に答える