8

キーボードのキーを表す文字列を、 Qt :: Key(またはその他)のようなキーコード列挙型に変換したいと思います。変換の例は次のとおりです。

  • "Ctrl"Qt::Key_Control
  • "Up"Qt::Key_Up
  • "a"Qt::Key_A
  • "5"Qt::Key_5

ご覧のとおり、上記には英数字キーだけでなく、修飾子と特殊キーも含まれています。私はQtキーコード列挙型に接続していませんが、QtQKeySequencefromString静的関数にこの解析機能があるようです(この直接リンクを参照)。

QKeySequence fromString(const QString & str, SequenceFormat format);

あなたは私がこの変換を必要とする理由としてかもしれません。さて、 GhostMouseによって生成されたデータファイルがあります。入力した内容のログです。これが私の入力例です" It "

{SPACE down}
{Delay 0.08}
{SPACE up}
{Delay 2.25}
{SHIFT down}
{Delay 0.11}
{i down}
{Delay 0.02}
{SHIFT up}
{Delay 0.03}
{i up}
{Delay 0.05}
{t down}
{Delay 0.08}
{t up}
{Delay 0.05}
{SPACE down}
{Delay 0.12}
{SPACE up}

したがって、文字列「SPACE」と、このデータファイル内のキーを表す他のすべての文字列を一意のに変換する方法が必要ですint

4

3 に答える 3

9

QKeySequence文字列とキーコードを変換するために使用できるため、あなたはすでに正しい方向に進んでいます。

QKeySequence seq = QKeySequence("SPACE");
qDebug() << seq.count(); // 1

// If the sequence contained more than one key, you
// could loop over them. But there is only one here.
uint keyCode = seq[0]; 
bool isSpace = keyCode==Qt::Key_Space;
qDebug() << keyCode << isSpace;  // 32 true

QString keyStr = seq.toString().toUpper();
qDebug() << keyStr;  // "SPACE"

OPによって追加されました

上記は、Ctrl、Alt、Shiftなどの修飾キーをサポートしていません。残念ながら、キー自体をキーとしてQKeySequence認識しません。Ctrlしたがって、修飾キーをサポートするには、「+」記号を使用して文字列表現を分割してから、各部分文字列を個別に処理する必要があります。完全な機能は次のとおりです。

QVector<int> EmoKey::splitKeys(const QString &comb)
{
    QVector<int> keys;
    const auto keyList = comb.split('+');
    for (const auto &key: keyList) {
        if (0 == key.compare("Alt", Qt::CaseInsensitive)) {
            keys << Qt::Key_Alt;
        } else if (0 == key.compare("Ctrl", Qt::CaseInsensitive)) {
            keys << Qt::Key_Control;
        } else if (0 == key.compare("Shift", Qt::CaseInsensitive)) {
            keys << Qt::Key_Shift;
        } else if (0 == key.compare("Meta", Qt::CaseInsensitive)) {
            keys << Qt::Key_Meta;
        } else {
            const QKeySequence keySeq(key);
            if (1 == keySeq.count()) {
                keys << keySeq[0];
            }
        }
    }
    return keys;
}
于 2012-12-25T22:00:28.117 に答える
1

ほとんどのキーコードを復元できます。たとえば、QKeySequence::fromString("SPACE")[0]32を返します。Shift、Ctrlなどでは機能しないため、一部の文字列を自分で処理する必要があります。

于 2012-12-25T22:01:16.257 に答える
1

一行で、それを試してください:

qDebug() << QKeySequence(event->modifiers()+event->key()).toString() << '\n';

最初にQKeySequenceコンストラクターを呼び出し、次にtoString()を使用して文字列に変換します。

出力(最後のものはWindowsキーです):

"Alt+??"

"Alt+A"

"Alt+A"

"Alt+A"

"A"

"S"

"F1"

"F2"

"Home"

"Ins"

"Num+8"

"Num+5"

"Num+4"

"Num+."

"Num++"

"Num+-"

"Num+/"

"Num+*"

"??"
于 2013-10-12T15:07:43.127 に答える