2

ユーザーが編集できるように、Qt でショートカット ハンドラーを実装しようとしています。インタラクティブにしたいので、終了時だけでなく、現在入力中のショートカットを表示しています。解決策にはほど遠いと思いますが、メタ キー (Windows の Windows キー) にはまだ問題があります。

以下の最初の if ステートメントでは検出されるようですが、修飾子関数を使用した最後の if ステートメントでは検出されないようです。

void ShortcutInputWidget::handleKeyEvent(QKeyEvent *event)
{
    int keyDisplayed = event->key();
    Qt::Key keys = static_cast<Qt::Key>(keyDisplayed);

    // if the key pressed is only a modifier, we reset the key
    if(keys == Qt::Key_Control ||
        keys == Qt::Key_Shift ||
        keys == Qt::Key_Alt ||
        keys == Qt::Key_Meta)
    { 
        qDebug() << "Single press of special key: Ctrl, Shift, Alt or Meta";
        if (keys == Qt::Key_Meta)
            qDebug() << "meta: " << QKeySequence(Qt::META);
        keyDisplayed = 0;
    }

    // handle modifiers
    Qt::KeyboardModifiers modifiers = event->modifiers();
    QString text = event->text();
    qDebug() << text;
    if (modifiers & Qt::ShiftModifier){
        keyDisplayed |= Qt::SHIFT;
        qDebug() << "shift modifier detected";
    }
    if (modifiers & Qt::ControlModifier){
        keyDisplayed |= Qt::CTRL;
        qDebug() << "control modifier detected";
    }
    if (modifiers & Qt::MetaModifier){
        keyDisplayed |= Qt::META;
        qDebug() << "meta detected";
    }
    if (modifiers & Qt::AltModifier){
        keyDisplayed |= Qt::ALT;
        qDebug() << "alt modifier detected";
    }

    qDebug() << QKeySequence(keyDisplayed);
    setText(QKeySequence(keyDisplayed));
    event->accept();
}

メタ キーのみをヒットした場合の出力はmeta: QKeySequence("Meta+")nometa detectedです。しかし、「ctrl + meta」を押すと、両方のステートメントでメタ キーが検出されます。

私は何か間違ったことをしていますか?

編集: Windows 7 を使用していて、EN-GB キーボードを使用していることを忘れていました。

4

2 に答える 2

2

Windowsでは、Windowsキーは修飾子ではないようです。によって取得された値をデバッグまたは印刷する場合

 Qt::KeyboardModifiers modifiers = event->modifiers();

Windowsキーを押すと空のフラグが表示されますが、処理する他のキーには空でないフラグが表示されます... Windowsでの私の経験は、Windowsキーはユーザーアプリケーションで使用されないため、理にかなっていると思います。

これで、MacキーはMac OSではデフォルトで修飾子になり、MacコンピューターでWindowsを実行すると、Windowsキーがこのキーに割り当てられます。これは、OS Xを実行しているときは有効な修飾子であり、Windowsを実行しているときは無効である可能性があるため、非常に注意が必要です。

私ができる唯一のアドバイスは、達成したいことをもう一度考えてから、Mac、Windows、およびLinuxで別々にテストすることです。移植性を確保する必要がある場合があります。

于 2012-05-14T13:35:15.723 に答える
0

Linux [Qt Creator] で同じサンプルを実行します。それは完全に機能し、両方のメッセージが表示されました。あなたの場合、OS関連の問題かもしれません。私が押したキーは、メタキーとして検出されたWindowsキーでした。

Single press of special key: Ctrl, Shift, Alt or Meta 
meta:  QKeySequence("Meta+") 
"" 
meta detected 
QKeySequence("Meta+")  
于 2012-05-14T13:24:44.473 に答える