0

私の子ウィジェットはkeyPressEventsを取得しませんが、トップレベルウィンドウと同じウィジェットを配置すると取得します。フォーカスを設定しようとしましたが、これには影響しません。コードは以下にあり、私が何をしようとしているのかを示しています。

#include <QApplication>
#include <QKeyEvent>
#include <QLCDNumber>
#include <QLabel>
#include <QVBoxLayout>

class DigitSummer: public QLCDNumber {
    Q_OBJECT

public:
    DigitSummer(QWidget *parent = nullptr) : QLCDNumber(parent) {
    }

protected:
    void keyPressEvent(QKeyEvent *event) override {
        display(intValue() + event->text().toInt());
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

#if 1 // this version does not work, number does not increase
    QWidget widget;
    widget.setLayout(new QVBoxLayout());
    widget.layout()->addWidget(new QLabel("Press digits!"));
    DigitSummer summer; // in stack: must be after widget to avoid child delete
    widget.layout()->addWidget(&summer);
    widget.setFocusProxy(&summer); // I notice no effect!
    widget.show();

#else // this version works, number grows with keypresseas
    DigitSummer summer;
    summer.show();
#endif

    return a.exec();
}

#include "main.moc"

完全なものについては、同じ .pro ファイル:

QT += core gui widgets
TARGET = QtMCVE
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
CONFIG += c++11
QMAKE_CXXFLAGS += -Wall -Wextra
SOURCES += main.cpp

キー イベントを受信するようにウィジェットを修正するにはどうすればよいですか?

この関連する質問では、イベント フィルターのインストールが提案されていますが、私はそうしたくありません。ウィジェット自体を修正するための自己完結型の方法が必要です。

4

1 に答える 1