26
  1. それらの違いは何ですか?

  2. QtではQPushButtonのホットキーがあれば「Alt+?」で作れますが、qactionなら「?」でできます。それだけ

4

3 に答える 3

28

Windows では、アクセラレータ キーはアプリケーション グローバルです。例: Alt+ F4.

ショートカット キーは、メニュー項目またはボタンの名前の一部であり、下線を引くことができ、そのメニュー項目またはボタンが直接使用できる場合に (修飾子なしで) 使用できます。

マイクロソフトから:

ホット キーは、ユーザーが操作をすばやく実行するために押すことができるキーの組み合わせです。たとえば、ユーザーは、特定のウィンドウをアクティブにして z オーダーの一番上に移動するホット キーを作成できます。

これは、ホット キーがシステム グローバルであることを示しているようです。

総括する:

  • ショートカット キー = 修飾子なし、メニュー内またはウィンドウ内 (ボタンの場合) にローカル
  • アクセラレータ キー = 通常は修飾子付き、アプリケーション グローバル
  • ホットキー = 明らかにシステムグローバル

Qt での特定の意味については知りません。それについては、Qt のドキュメントを参照してください。

于 2012-04-16T06:04:10.307 に答える
11

アルフの答えは、Windows の適用性に対して正しいです。あなたが言及した用語 (ホットキー/ショートカット/アクセラレータ) は、純粋な Qt の観点からは聞き覚えがありません。

Qt では、キー シーケンスを自分で処理するか、Qt 独自の簡略化方法を使用するかを選択できます。いずれにせよ、Qt 自体は、キーの組み合わせが意味を成す場合としない場合がある多くのプラットフォームをターゲットにしていることを覚えておく必要があります。古典的なAlt+はキーボードでは意味がありますが、モバイル デバイスでは修飾子やキーF4はありません。あなたが本当に欲しいのは、アプリケーションのショートカットを閉じるジェネリックを指定する方法です。この問題は、シンボルが使用可能である可能性がありますが、他のキーボード レイアウトではそれに到達するためのキー シーケンスが異なる可能性があるため、倍増します。ドキュメントのこのセクションは、良い例を提供します。AltF4

Qt はこれを で処理しclass QKeySequenceます。非常に賢い Qt 開発者は、一般的なユーザー アクションを定義する簡単な方法を提供しました。これらのアクションは、ターゲット プラットフォームのデフォルトであるキーの組み合わせを使用します。アプリケーションの例を閉じるenum QKeySequence::StandardKeyと、次のように使用できます。

QAction exitAction;
exitAction.setShortcut(QKeySequence(QKeySequence::Quit));

これはすべてドキュメントで説明されています。より高度な方法でアプリケーションに影響を与える QActions に適用できる他の 2 つの修飾子 (shortcutContext()および) があります。softKeyRole()

次のようなものを使用して、独自のショートカットを自由に割り当てることもできます。

QAction helpAction(tr("&?"));
helpAction.setShortcut(QKeySequence(tr("ALT+?")));

最初の行は、(翻訳された) テキスト "?" を適用します。メニューまたはボタンにテキストとして表示されるアクションに。疑問符記号はすべての言語で適切な記号ではない可能性があるため、translate メソッドを使用すると、翻訳者は必要に応じてより適切な記号を割り当てることができます。アンパサンド記号は、メニューがアクティブな場合、その直後の文字がショートカット キーになることを意味します。

Alt2 行目は+の (翻訳された) ショートカットを割り当てます。?この例では、Shift修飾子は必要に応じてプラットフォームによって処理されます。繰り返しになりますが、このtr()メソッドを使用すると、翻訳者はより適切なショートカットが利用可能であれば指定できます。


teukkam のコメントに応えて:

ボタンが変更されたかどうかに関係なく、キーストロークによってボタンをトリガーできるようにしたいだけの場合は、Alt次のようにすることができます。

QPushButton* yourButton; // assign this pointer yourself
yourButton->setText(tr("&Process"));
yourButton->setShortcut(tr("p"));

この例では、アンパサンド insetText()は前の例と同じことを行い、translate 関数は同じ方法で使用されます。

setShortcut()メソッドは文字「p」を使用するだけなので、修飾子の有無にかかわらず機能するはずですAltShiftキーシーケンスの文字は明らかに大文字と小文字を区別しないため、ドキュメンテーションをざっと見ると、これは修飾子の有無にかかわらず機能することが示唆されています。

また、P は印刷コマンドであると見なされることが多いため、悪い選択です。

ハードコードされたショートカットを定義している場合は、すべてのターゲット プラットフォームで動作することを確認してください。

于 2012-04-16T07:59:17.490 に答える