Qt のイベント フィルタリング メカニズムを理解しようとしています。その趣旨で、私は QLineEdit をサブクラス化し、実際の QLineEdit が行う前にキーの押下をキャプチャしようとしました。私が書いたコード (ほとんどは Qt のドキュメントから貼り付けたもの) は部分的に機能します。いずれかのキーを押すと、QLineEdit は正しく "Ate key press LETTER" と表示します。
Option キー (私は Mac を使用しています) を押して "S" と押すと、正しく "Ate key press ∫" と表示されます。ただし、Option キーを押したままもう一度「S」を押すと、QLineEdit に「Ate key press ∫∫」と表示されますが、これは説明できません。この 2 回目 (およびそれ以降) のキー「S」の押下は、QKeyEvent または QShortcutEvent ではなく、実際のウィジェットに直接配信されるように見えますが、それはどのようなイベントなのでしょうか?
さらに複雑なことに、Option キーを押しながら「S」以外のキーを押すと、そのキーによって結果が異なります。たとえば、キー シーケンス Option+{S,D,F,G,H} の場合、QLineEdit は「Ate key press ∫∂ƒ™」と読み取ります。ただし、「J」を押し続けると、QLineEdit は「Ate key press ¶」のみを読み取ります。
誰かがこの動作を再現でき、さらに良いことに、それを説明できますか? よろしくお願いします。
main.cpp :
#include <QApplication>
#include "customlineedit.h"
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
CustomLineEdit w;
w.show();
return a.exec();
}
customlineedit.h
#ifndef CUSTOMLINEEDIT_H
#define CUSTOMLINEEDIT_H
#include <QLineEdit>
class CustomLineEdit : public QLineEdit
{
Q_OBJECT
public:
explicit CustomLineEdit(QWidget *parent = 0);
virtual bool eventFilter(QObject *watched, QEvent *event);
};
#endif // CUSTOMLINEEDIT_H
customlineedit.cpp
#include "customlineedit.h"
#include <QKeyEvent>
CustomLineEdit::CustomLineEdit(QWidget *parent) :
QLineEdit(parent)
{
this->installEventFilter (this);
}
bool CustomLineEdit::eventFilter (QObject *watched, QEvent *event)
{
if (event->type () == QEvent::KeyPress
|| event->type () == QEvent::ShortcutOverride) {
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
this->setText("Ate key press " + keyEvent->text());
return true;
} else if (event->type () == QEvent::Shortcut) {
this->setText ("Shortcut event");
return true;
} else {
return false;
}
}