11

特定のアクションにどのキー コマンドをマップするかを指示する JSON 構成ファイルを読み込もうとしている状況にあります。例えば:

...
{ 
    "Action": "Quit",
    "Combo" : "CTRL+Q"
},
...

コンボ タグからaQKeySequenceを作成するのは簡単ですが、QKeyEventアクションをトリガーするために s を監視する必要があります。s はアプリケーション内の他の目的にも使用されるため、監視する必要があることに注意してください。QKeyEventつまり、s のキー コマンドだけを監視することは受け入れられませんQKeySequence(それが可能であるとしても)。

QKeyEventタグごとにオブジェクトを作成するカスタム パーサーを作成する以外に、 a とa"Combo"を比較する方法はありますか? 例えば:QkeyEventQKeySequence

QKeyEvent KeyCommandsHandler::toKeyEvent(QKeySequence sequence) {
   //somehow convert to QKeyEvent
}
4

3 に答える 3

7

QKeyEvent一般に、QKeySequenceオブジェクト を比較することはできません。は単一のキーの押下またはリリースQKeyEventのイベントを表しますが、 には最大 4 つのキーのシーケンスを含めることができ、それぞれにオプションの修飾子情報があります。QKeySequence

ただし、キー シーケンスに含まれるキーが常に 1 つだけであることが確実な場合は、オブジェクトを比較できます。

bool isEquiv(const QKeyEvent& event, const QKeySequence& seq)
{
    if (seq.count() != 1)
        return false;
    return seq[0] == (event.key() | event.modifiers());
}

QKeyEventtoの変換関数を書くこともできますQKeySequence:

QKeySequence toKeySequence(const QKeyEvent& event)
{
    return QKeySequence(event.key() | event.modifiers());
}

ただし、またはなどの特定のイベント タイプを選択する必要があるため、 aQKeySequenceを aに変換しても意味がないことに注意してください。QKeyEventQEvent::KeyPressQEvent::KeyRelease

于 2012-04-30T15:34:00.763 に答える
0

KeyEvent を KeySequence に変換するためのコードを含む Qt4.7 ノート。 (しかし、QKeyEvent.key() からのキーコードの int を文字列にキャストするため、コードに欠陥があります。QKeyEvent.text() を使用した方がよいでしょうか?)

また、フェルディナンドの答えのコード:

QKeySequence(event.key() | event.modifiers())

はタイプ セーフではありません (int と QKeyboardModifiers が混在しています)。Python に変換された場合、PyQt では失敗しますが、PySide では失敗しますか?

また、「QKeyEvent は 1 つのキーを押したり離したりするイベントを表します」は、実際にはそれを説明していません。QKeyEvent は、キーが押された順序ではなく、どのキーの組み合わせが押されたかを示すことができます。ユーザーがキーを順番に押すと、アプリは QKeyEvents のシーケンスを取得する場合があります (アプリが QKeyEvent のデフォルト ハンドラーを使用しているかオーバーライドされたハンドラーを使用しているかによって異なります)。後の QKeyEvents は、イベントの時点で押されていたすべてのキーを表示します。 . 彼らはもはやダウンしていないかもしれません。それはかなり複雑です。

于 2013-09-12T14:51:21.697 に答える