ユーザーが編集できるように、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 キーボードを使用していることを忘れていました。