Почему NativeEvent не регистрирует нажатия клавиш?

Я настроил свое приложение для печати оператора отладки при нажатии F8 или F7 на клавиатуре. Однако nativeEvent, похоже, не воспринимает ввод с клавиатуры, почему?

фрагмент mainwindow.cpp:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QKeySequence defaultKeySequence("F9");
    ui->keySequenceEdit->setKeySequence(defaultKeySequence);

    registerHotKey(100, 0, VK_F8);
    registerHotKey(101, 0, VK_F7);

}


bool MainWindow::registerHotKey(int id, int modifiers, int key) {
    if (!RegisterHotKey((HWND)MainWindow::winId(), id, modifiers, key)) {
        qDebug() << "Failed to register hotkey with ID:" << id;
        return false;
    }
    qDebug() << "Registered hotkey with ID:" << id;
    return true;
}


bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result){
    Q_UNUSED(eventType);
    Q_UNUSED(result);
    qDebug() << "Received message:";
    return false;
}

фрагмент mainwindow.h:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();


    Ui::MainWindow *getUi() const;


protected:
    bool nativeEvent(const QByteArray &eventType, void *message, long *result);

private slots:
    // Stuff

private:
    Ui::MainWindow *ui;
};

После запуска приложения выходные данные дают:

STARTING APPLICATION!
Hotkey changed to:  QKeySequence("F9")
Registered hotkey with ID: 100
Registered hotkey with ID: 101

При нажатии F8 и F7 выходные данные отладки не отображаются.

🤔 А знаете ли вы, что...
Язык C++ позволяет работать с указателями и адресами памяти, что требует осторожности при программировании.


1
59
1

Ответ:

Решено

Для Qt6 подпись переопределяемого метода:

bool QWidget::nativeEvent(const QByteArray &eventType, void *message, qintptr *result)

Если на вашей платформе std::is_same_v<qintptr, long> есть false, то вы перегружаете или затеняете метод вместо того, чтобы переопределить его. Чтобы избежать подобных ошибок, рекомендуется использовать ключевое слово override:

// this will result in compilation error:
bool nativeEvent(const QByteArray &eventType, void *message, long *result) override;