3

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;
    }
}
4

1 に答える 1